1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水。

1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水。

这个题是对bit位的应用,1000接近1024,所以对1000瓶水编号需要10个bit位,即对瓶子进行编号0~999,
10个bit 对应需要10只老鼠,编号1~10。

瓶子的编号分别为:

00000,00000

00000,00001

00000,00010,

00000,00011

00000,00101

00000,00111

。。。。。。

11111,00111

同时给老鼠编号,从1,2,…10,从低位开始,让第n个编号老鼠喝下第n个bit位为1的瓶子中的药水。
一周后,若所有的老鼠都没有发病,那么是第0个瓶子有毒,
如果有一些编号的老鼠发病,死亡的老鼠记为1,正常老鼠记为0,那么按照老鼠编号1-10对应bit位从低到高,对应的10进制即为有毒药水的编号。
——————————————————————————————————————————
附上百度解释
给1000个瓶分别标上如下标签(10位长度):
0000000001 (第1瓶)
0000000010 (第2瓶)
0000000011 (第3瓶)
……
1111101000 (第1000瓶)
从编号最后1位是1的所有的瓶子里面取出1滴混在一起(比如从第一瓶,第三瓶,。。。里分别取出一滴混在一起)并标上记号为1。以此类推,从编号第一位是1的所有的瓶子里面取出1滴混在一起并标上记号为10。现在得到有10个编号的混合液,小白鼠排排站,分别标上10,9,。。。1号,并分别给它们灌上对应号码的混合液。24小时过去了,过来验尸吧:
从左到右,死了的小白鼠贴上标签1,没死的贴上0,最后得到一个序号,把这个序号换成10进制的数字,就是有毒的那瓶水的编号。
检验一下:假如第一瓶有毒,按照0000000001 (第1瓶),说明第1号混合液有毒,因此小白鼠的生死符为0000000001(编号为1的小白鼠挂了),0000000001二进制标签转换成十进制=1号瓶有毒;假如第三瓶有毒,0000000011 (第3瓶),第1号和第2号混合液有毒,因此小白鼠的生死符为00000011(编号为1,2的鼠兄弟挂了),0000000011二进制标签转换成十进制=3号瓶有毒。

————————————————————————————————————————————
举例,10瓶药水,4个bit表示,对应药水编号0-9,又4个bit对应4个老鼠,则老鼠编号1-4,
0000, 0
0001, 1
0010, 2
0011, 3
0100, 4
0101,5
0110,6
0111,7
1000,8
1001,9

老鼠编号 对应药水瓶子编号
1, ,,, 1,3,5,7,9
2, ,,, 2,3,6,7
3, ,,,4,5,6,7
4, ,,,8,9

如果一周之后,全都安然无恙,则0号药水瓶子有毒,
如果1,2,3编号老鼠死亡,则很容易看出7号有毒,
或者1,2,3编号老鼠置为1,4号置为0,从低到高即为0111=7.

你可能感兴趣的:(面试算法题总结)