则是:如果某个瓶子的对应2进制位为1则喂给该小白鼠,如果对应的2进制为则不喂,譬如1号小白鼠,则会喝到1号水瓶,3号水瓶,5号水瓶,......和999号水瓶的混合水。喂完之后就是等结果了。
死了的小白鼠标记1,没死的标记。如果只有1号小白鼠死了,那么就是 1,结果是1号水瓶有毒。如果是8,9号小白鼠死了那么就是 1 1 ,结果是6号水瓶有毒,如果都没死,那就是号水瓶有毒了,显然上面的混合方法里面号水瓶的水没有喂给任何一只小白鼠。为什么这样?其实很容易想明白,有毒的水喂了的小白鼠都死了,其它的都没有死,就这么简单。2016腾讯笔试题礼仪大全。一般在面试的时候没搞这么大的数据,一般是4只老鼠,16瓶水(真心是考思维过程)。
其实这个方法有一个理论算法支撑:Bloom Filter算法。有兴趣的可以查查资料。
附带说再多说一句,小白鼠真惨。
第二道题目,是一个C++基础题目。我常常拿这个题目考那种简历上面写着精通C++的面试者(当然,一般是应届生)。首先准备一页白纸,在它的A面写上这样一段代码: class A
public:
void function(){printf('Hello World');}
A* p1 = NULL;
p1-function();
在它的B面写上同样一段代码,只有一点点差异: class A public:
virtualvoid function(){printf('Hello World');}
A* p1 = NULL;
p1-function();
然后这样开始问,首先拿着A面的程序给面试者,问它程序会怎么样,
面试者可能的答案是:一种是程序直接crash,二种是程序输出Hello World,运行正常,三种是程序输出Hello World,然后crash;然后把纸翻过来,再问面试者,程序会怎么样。如果面试者能把这个问题回答正确,并且解释清楚(关键是解释清楚),说明面试者的C++基础还是不错的。
这个题目的真实答案,就不公布了,知道原因了,很简单,可以看下下面这段程序的汇编代码(一目了然):
#include <stdio.h class A { public:
void function(){printf('Hello World');} }; class B
{ public:
virtual void function(){printf('Hello World');} };
int _tmain(int argc, _TCHAR* argv[]) {
A* p1 = NULL;
p1-function();
B* p2 = NULL;
p2-function();
};复制代码 A* p1 = NULL;
4113FCmov dword ptr [p1],
p1-function();
41143mov ecx,dword ptr [p1]
41146call A::function (411E6h) B* p2 = NULL;
4114Bmov dword ptr [p2],
p2-function();
411412mov eax,dword ptr [p2]
411415mov edx,dword ptr [eax]
411417mov esi,esp
411419mov ecx,dword ptr [p2]
41141Cmov eax,dword ptr [edx]
41141Ecall eax '''