题目:1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?
思路:10只小白鼠,喝了药水之后第二天只有存在和挂掉两种情况,我们用计算机二进制里面的0和1来进行模拟,1代表喝、0代表不喝。
【 二进制映射喝法:0000000001对应十进制编号第1瓶药水 】
【 二进制映射喝法:0000000010对应十进制编号第2瓶药水 】
【 二进制映射喝法:0000000011对应十进制编号第3瓶药水 】
【 二进制映射喝法:0000000100对应十进制编号第4瓶药水 】
【 二进制映射喝法:0000000101对应十进制编号第5瓶药水 】
【 二进制映射喝法:0000000110对应十进制编号第6瓶药水 】
【 二进制映射喝法:0000000111对应十进制编号第7瓶药水 】
【 二进制映射喝法:0000001000对应十进制编号第8瓶药水 】
【 二进制映射喝法:0000001001对应十进制编号第9瓶药水 】
【 二进制映射喝法:0000001010对应十进制编号第10瓶药水 】
【 二进制映射喝法:0000001011对应十进制编号第11瓶药水 】
【 二进制映射喝法:0000001100对应十进制编号第12瓶药水 】
【 二进制映射喝法:0000001101对应十进制编号第13瓶药水 】
····至
【 二进制映射喝法:1111100111对应十进制编号第999瓶药水 】
【 二进制映射喝法:1111101000对应十进制编号第1000瓶药水 】
然后,我们把1000瓶药水编号,让10只小白鼠用以上的1000种喝法喝下药水。然后第二天通过观察小白鼠的存活情况,就可以判断出是第几瓶药水是有毒的。(小白鼠也需要编号,我们需要明白同样是死了一只小白鼠,第一只挂掉和第十只挂掉是不一样的。)
以上摘自(点击打开链接)
这是我昨晚在微信上看到的一条面试题,当时看答案我都看了好一会才完全看懂。
问题最主要的是两个方面:十只小白鼠要怎么喝?怎么判定哪一瓶是毒药?
后来拿去考了一下室友,刚看到答案也是好像立马懂了,但具体问他小白鼠怎么喝时 逻辑便乱了,显然还没有完全弄明白。上面的答案你看明白了吗?你能清晰的解释这十只小白鼠要怎么喝这1000瓶药水吗?例如刚开始的时候,哪只老鼠喝哪瓶?
其实举具体的例子是理解答案、理解代码最好的方法。
我们把1000瓶药水从1~1000编号,并用二进制表示。十位二进制数对应十只小白鼠,我们对小白鼠从左往右编号1~10。
喝法:第一瓶药水:10号老鼠喝,其它不喝。
第二瓶药水:9号老鼠喝,其它不喝。
第三瓶药水:9号和10号老鼠喝,其它不喝。
第四瓶药水:8号老鼠喝,其它不喝。
第五瓶药水:8号和10号老鼠喝,其它不喝。
第六瓶药水:8号和9号老鼠喝,其它不喝
……
……
(二进制的每位对应十只小白鼠,1表示喝,0表示不喝。二进制换算成十进制则对应的是第几瓶药水)
结果:假如第十瓶(0000001010)是毒药。二进制0000001010表示7号和9号老鼠喝过,第二天肯定只有这两只老鼠死了。