您的位置:首页 > 职场人生

大众点评实习生面试题(1)

2013-06-07 19:26 141 查看
下面是大众点评网技术部测试开发实习生的几道面试题

1,要求实现库函数strcpy,

原型声明:extern char *strcpy(char *dest,char *src);

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。

解析:这是我们常用的一个库函数,虽然只是一个简单的库函数,但是要注意细节的把握。例如对条件的判断等等。

char * strcpy( char *strDest, const char *strSrc )  //将源字符串加const,表明其为输入参数
{
if(strDest == strSrc)   //考虑到源目所指区域有重叠的情况
{
return strDest;
}

assert( (strDest != NULL) && (strSrc != NULL) );  //对源地址和目的地址加非0断言
char *address = strDest;

while( (*strDest++ = * strSrc++) != '\0');
return address;     //为了实现链式操作,将目的地址返回
}


2,有16个一模一样的瓶子,其中有15瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有4只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

这个问题的答案也堪称经典:把瓶子从 0 到 15 依次编号,然后全部转换为 4 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0,等等。每只老鼠的死活都能确定出10位二进制数的其中一位,由此便可知道毒药瓶子的编号了。

由于2^4=16,所以我们只需要4只老鼠就能检查16瓶水,同理,我们只需要10老鼠就能检查1024瓶水。即 n 只老鼠能检查出 2^n 瓶水。

拓展一下:

如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

答案:7 只老鼠就足够了。事实上,7 只老鼠足以从 3^7 = 2187 个瓶子中找出毒药来。首先,把所有瓶子从 0 到 2186 编号,然后全部转换为 7 位三进制数。现在,让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子,让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子,等等。一星期之后,如果第一只老鼠死了,就知道毒药瓶子的三进制编号中,右起第一位是 2 ;如果第二只老鼠没死,就知道毒药瓶子的三进制编号中,右起第二位不是 2,只可能是 0 或者1。 也就是说,每只死掉的老鼠都用自己的生命确定出了,三进制编号中自己负责的那一位是
2 ;但每只活着的老鼠都只能确定,它所负责的那一位不是 2 。于是,问题就归约到了只剩一个星期时的情况。在第二轮实验里,让每只活着的老鼠继续自己未完成的任务,喝掉它负责的那一位是 1 的所有瓶子。再过一星期,毒药瓶子的三进制编号便能全部揭晓了。

类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)^n 个瓶子中检验出毒药来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: