java多线程实现找毒酒_Java算法面试题(009) 毒酒问题

介绍

1000桶酒,其中1桶有毒。用小老鼠做实验,一旦吃了有毒的酒,一周后小老鼠毒性就会发作而亡。问如何在最短的时间内用最少的老鼠找到那桶有毒的酒?

思路一

将现有的酒分成两组,分别将两组酒混合后喂给两只老鼠,1周以后即能分出哪组里存在毒酒;依次类推的话。

2的10次方为1024,因此进行10次迭代操作,即可找到那桶毒酒。总计使用20只老鼠,10周时间找到毒酒桶。

这个估计大部分程序员都能想到的方案,但这个不是最佳的方案。

思路二

给现有的桶按1-1000的编号,最大编号为1000,其二进制表示11 1110 1000,共10位。我们使用10只老鼠,编号分别为:

第01只 00 0000 0001

第02只 00 0000 0010

第03只 00 0000 0100

第04只 00 0000 1000

第05只 00 0001 0000

第06只 00 0010 0000

第07只 00 0100 0000

第08只 00 1000 0000

第09只 01 0000 0000

第10只 10 0000 0000然后根据桶编号给相应的老鼠喂酒,如编号为100的酒桶,其二进制表示为00 0110 0100,其中从左边数第3、6、7位为1,取这桶中的酒喂给编号为3、6、7的老鼠,依次类推,将所有酒桶取酒喂给相应的老鼠。一周以后,根据死亡老鼠的编号,可以找出的酒桶,举个例子:比如第1、2、3、4只老鼠死亡了,那么表示的二进制数为 00 0000 1111,转换成10进制为15,因此可以推断出编号为15的酒桶中的酒有毒。

这确实是一种比较精巧的解法,依据二进制的表示,快速找到有问题的酒桶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值