1,【微软】小老鼠试毒药
题目:
有1000瓶水,其中1瓶是有毒的,小老鼠如果喝了有毒的水会在一个星期后死掉,问至少需要多少只小老鼠来做实验,才能够在一星期后选出有毒的一瓶水。
答案:
10只。
我来解释一下,并给出一个方案,时间不是问题,一星期内肯定可以找出有毒的那瓶。
给1000个瓶分别标上如下标签(10位长度):
0000000001 (第1瓶)
0000000010 (第2瓶)
0000000011 (第3瓶)
......
1111101000 (第1000瓶)
从编号最后1位是1的所有的瓶子里面取出1滴混在一起(比如从第一瓶,第三瓶,。。。里分别取出一滴混在一起)并标上记号为1。以此类推,从编号第一位是1的所有的瓶子里面取出1滴混在一起并标上记号为10。现在得到有10个编号的混合液,小白鼠排排站,分别标上10,9,。。。1号,并分别给它们灌上对应号码的混合液。一周过去了,过来验尸吧: 从左到右,死了的小白鼠贴上标签1,没死的贴上0,最后得到一个序号,把这个序号换成10进制的数字,就是有毒的那瓶水的编号。
检验一下:假如第一瓶有毒,按照0000000001 (第1瓶),说明第1号混合液有毒,因此小白鼠的生死符为0000000001(编号为1的小白鼠挂了),0000000001二进制标签转换成十进制=1号瓶有毒;假如第三瓶有毒,0000000011 (第3瓶),第1号和第2号混合液有毒,因此小白鼠的生死符为00000011(编号为1,2的鼠兄弟挂了),0000000011二进制标签转换成十进制=3号瓶有毒。
支撑算法:Bloom Filter算法
题目2:11瓶酒,有一瓶有毒,找出这瓶酒
答案2:因为2^3=8<11<2^4=16,所以用4个位就可以表示,所以四只老鼠。
题目3:11瓶酒,有一瓶有毒,找出可以喝的9瓶酒
答案3:http://blog.youkuaiyun.com/hbjiaxiaoxue/article/details/12585643
2,【微软】N球称重量
题目:有N个球,其中只有一个是重量较轻的,用天平只称三次就能找到较轻的球,以下的N值哪个是可能的?
Given a set of N balls and one of which is defective(weighs less than others), you are allowed to weigh with a balance 3 times to find the defective. Which of the following are possible N?(A,B,C,D)
A. 12
B. 16
C. 20
D. 24
E. 28
解答:12个,分成三组4,4,4,先拿出其中两组称量,若左边轻,则坏球在左边,若右边轻则坏球在右边,若平衡,则坏球在剩下的四个当中。这样一次称量就将球减少到4个。将4个分成两组2,2,若左边轻则坏球在左边,反之在右边。第二次称量将球减少到2个。剩下两个再称量一次显然就确定了。也有其他可行的分组方法。A正确。
16个,分成三组6,6,4,先称量两组6个球的,则坏球要么在4个当中,要么在两组6个当中的一组,4个的用两次可以确定坏球。6个的再分成2,2,2三组,同样可以用一次减少到两个球,最后确定坏球。也有其他可行的分组方法。B正确。
20个,分成6,6,8三组,若在6个当中,两次可以找出,若在8个当中,将其分成3,3,2三组,两次也可以确定。也有其他可行的分组方法。
24个,分成8,8,8。第一次称量减少到8个,剩下8个两次可以确定,也有其他可行的分组方法。
28个无法三次确定。
总之,3个球以内一次,可一次称量确定。4~9个球可两次称量确定。10~27个球可三次称量确定。对于三次称量,只要第一次分成的三组,每组不多于9个即可。
3,【微软】知道了二叉树的哪些排序序列后,可以确定一颗二叉树。
We can revocer the binary tree if given the output of
A. Preorder traversal and inorder traversal
B. Preorder traversal and postorder traversal
C. Inorder traversal and postorder traversal
D. Postorder traversal
解答:
中序遍历和前序遍历
中序遍历和后序遍历
中序遍历和层次遍历
这3种都可以确定一颗