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只小白鼠没都没喝你,人家凭什么死啊。对吧?所以说就是这么个道理。

  • 27
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值