1000瓶药,1瓶有毒,找毒药
【经典面试题】找毒药
问:现有1000瓶药,其中999瓶无毒,只有一瓶有毒。已知小白鼠喝了毒药1小时后会死,现给你10只小白鼠,和1个小时的时间,让你找出有毒的那瓶药。
备注:每一瓶药的量足够每只小白鼠同时服用。
当看到这么一道题的时候,我相信很多IT界的小伙伴都会第一瞬间想到二分法,左边500瓶,右边500瓶…当然,我也一样。
显然,这样的想法只能暴露出自己太年轻了。
其实这道题做法有很多,各路大神,奇思妙想。而我用了一种相对简单一点的办法。请看下面:
首先,我们应该肯定的是10只小白鼠是能够找出那瓶毒药的,为什么呢?
因为,每只小白鼠都有两种状态,死亡和活着。2的10次方就是1024,大于1000,所以是能的。(有点类似于算ip地址范围)
第一步:我们将10只小白鼠进行1-10的编号(小学生都会)。并将它与我们的二进制对应数字相对应。
第二步:我们将1000瓶药,从1-1000进行二进制的转换,例如:
第1瓶药:1----1
第2瓶药:2----01
第3瓶药:3----11
第4瓶药:4----001
以此类推。。。
这个时候,我们的1000瓶药都有一个二进制数与之对应
然后,我们让小白鼠的编号与药的二进制相对应,就像下面这样:
二进制的0、1,你可以把它理解为开关,在这里也一样,我们第4瓶药的二进制是001,所以第三只小白鼠就要喝这个药。便于大家理解,我再放一个实例,如下图所示:
第10瓶药,要喝它的小白鼠就是第2和第4只。就是这么个意思。
第三步:这10只小白鼠就把1000瓶药都品尝了个遍,到最后是不是就会死的死,活的活啊?那么我们就将死的小白鼠的编号记下来,例如:
死亡小白鼠的编号:2,5,6,7
我们就将这个编号对应的数字进行相加:2+16+32+64,这样就可以得出与之对应的那瓶药了。
那可能有的小伙伴会问了,为什么这样可以呢?
因为:我们将1000个数字转换成二进制,例如01011(26),此时这瓶药喝过的小白鼠有第2,4,5只。如果010111(58),这样喝过这瓶药的小白鼠有第2,4,5,6只。而此时死的小白鼠编号是2,4,5,6,那么敢肯定的是第26瓶药是没毒的,要不然人家第6只小白鼠没都没喝你,人家凭什么死啊。对吧?所以说就是这么个道理。