【随手记】有趣的面试题 — 兔子试毒

题目描述

有1000瓶药水,其中有一瓶是毒药,只要喝上一滴,一天之后就必死无疑。现在提供一批兔子来试毒,那我们怎么花最少的兔子、最少的时间,找出这瓶毒药呢?
在这里插入图片描述

从时间角度考虑

简单来说,就是堆兔子。直接拿1000只兔子试毒,一只兔子负责一瓶药水。结果自然是耗用1000只兔子,1天出结果。这样的优势比较明显,就是快;缺点也明显:使用的兔子太多,占资源。

从空间角度考虑

如果我们出于环保考虑,节约兔子,那么可以考虑用2分。第一轮就分为500瓶毒药为一组,先放一只兔子,每瓶药水喝一滴,这样可以排除500瓶。如果活着,就继续用这只兔子,如果死了,就补充兔子。我们按最坏情况来算:每次都要消耗掉一只兔子。

下一轮250瓶,这样循环迭代,1000->500->250->125->63->32->16->8->4->2->1

10个箭头,就是10次,也就是用了10天。这样我们只用了10只兔子,很节约,不过就是等得太心慌。

从编程思维考虑

还有没有更好的办法呢?时间短,效率高。

当然有,因为一次可以喝多瓶药水,那么我们可以用10只兔子,模拟出1024种情况。

给药水编号,从1-1000,兔子也编上号,1-10号,1000瓶药水编号,都转换为二进制编号,1就是000 000 0001,1000就是111 110 1000。
在这里插入图片描述
这种情况下,第几位为1,就让对应的兔子喝一滴药水。由于编号都是独一无二的,所以最后根据死掉的兔子,反过来组合一下,就是药水的编号。
在这里插入图片描述
如此一来,10只兔子,只花1天,就能试毒成功。无论空间,还是时间,都是最快的。

题目获取至微信公众号 【牛牛码特】, 本文纯属个人兴趣摘录整理 , 侵删。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值