前两天面试的时候,被问到了两个很有意思的题目:
一、找毒水
一共有100瓶药水,只有一瓶是毒药,已知如果小白鼠喝了这瓶有毒的药水(三天发作),即会在三天时死亡,请问如何在3天的时间里分辨出哪瓶是毒药,并且使用的小白鼠数量最少。
答案:7只
这个题题目其实很有意思,我当时一开始没搞懂题目意思,就想着3天后才会发作死亡,那怎么都不可能在三天之内找出这瓶毒药的啊。其实我是自己走到了一个死胡同,按照题目意思,是只要在刚好3天的这个时间里找出来就好,所以以后还是要首先搞懂题目意思再进一步思考。
好了,现在言归正传。
面试官给出了一种思路:利用一个10*10的数组,将100瓶药水放在这个数组的每个位置里,每行和每列的开头分别有一只小球,一共20只,给他们分别编号(r1~r10和c1~c10),会有两只老鼠喝了那瓶毒水,在3天时间到的时候,看是哪两只白鼠发作,根据发作的这两只白鼠的编号即可判断出哪瓶是毒水。
但是面试官说这不是最优的,要使小白鼠的数量尽可能最少,可以使用下面这个二进制的思想:
把100个瓶子按2进制编号,因为只有100个,2的8次方就够表示了,7只老鼠,按编号来,1号瓶子000 0001,给编号为1的老鼠吃,2为000 0010,给编号为2的老鼠吃,3为000 0011,给编号为1和2的老鼠吃,以此类推。最后根据3天时间时发作死亡的老鼠编号来判断瓶子编号为多少的是毒药。比如说编号为2,3,5的老鼠发作了,那说明毒水的编号为001 0110,即第22号瓶子有毒。
二、找重量不同的球
有8个小球,颜色和外观一模一样,其中一个小球Q的重量与其他的不同,它的重量比其他小球重,只有天平可以称量的出,问至少需要称多少次?
答案:2次
具体过程:将8个球分为三堆,每堆球的个数分别为3,3,2,先用天平称3和3,此时有两种情况,
(1)当天平两端重量不同时,说明Q就在重的那端3个球中,再将这3个球分为3堆每堆1个,取出其中两个放在天平上称,当这天平两端相等时,说明Q是没称的那一个,否则,Q是天平上重的那个小球。
(2)当天平两端重量相同时,说明Q在球数为2 的那一堆,将那两个球放在天平两端,重的那个球就是Q。
当Q球重量比其他小球轻的时候,此方法仍然可行,所以最少两次就可以称出来。