经典面试题【老鼠喝水】
面试题库【老鼠喝水】一、常见题目
我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分?
A、5瓶 B、6瓶 C、31瓶 D、32瓶
答案: C
二、详细思路
1.转换思维
从题目中我们得到已知的条件是:
- 很多瓶液体其中有一瓶为毒药。
- 5分钟时间测出成分,小白鼠毒发五分钟死亡,因此5只小白鼠需要同时进行试验。
- 每只老鼠有生与死两种状态。即 生0 死1。
可以简单联想到二进制数来表示老鼠的存活情况,也是此类题目的考察要点。
2.转换为熟悉的二进制
二进制格式为:
101100110011
将5只小白鼠分别对应每一位二进制:
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
1 0 0 0 0
示例:19 表示为 1 0 0 1 1
即 1 * 16 + 0 * 8 + 0 * 4 + 1 * 2 + 1 * 1
当 第一只 第二只 第五只死亡时
即可知道 第十九瓶液体 为毒药
提示:当五只老鼠均存活时,即 0 0 0 0 0 时 无法确认第三十二瓶 ,由于很多瓶 大于 三十二 ,我们只能知道毒药在其他液体中。
因此 我们可以检测至少 2^5 - 1 即 31 瓶
三、相似的题型
有100只一模一样的瓶子,编号1-100。其中99瓶是水,一瓶是看起来像水的毒药。只要老鼠喝下一小口毒药,一天后则死亡。现在,你有7只老鼠和一天的时间,如何检验出哪个号码瓶子里是毒药?
1.解题思路
从题目中我们得到已知的条件是:
- 100瓶液体其中有一瓶为毒药。
- 一天内测出成分,小白鼠毒发一天死亡,因此7只小白鼠需要同时进行试验。
- 每只老鼠有生与死两种状态。即 生0 死1。
同样可以简单联想到二进制数来表示老鼠的存活情况,也是此类题目的考察要点。
2.转换为熟悉的二进制
二进制格式为:
101100110011
将5只小白鼠分别对应每一位二进制:
0 0 0 0 0 0 1
0 0 0 0 0 1 0
0 0 0 0 1 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 1 0 0 0 0 0
1 0 0 0 0 0 0
示例:19 表示为 0 0 1 0 0 1 1
即 0 * 64 + 0 * 32 + 1 * 16 + 0 * 8 + 0 * 4 + 1 * 2 + 1 * 1
当 第一只 第二只 第五只死亡时
也可知道 第十九瓶液体 为毒药
7位二进制数最大可表示127 即 1 1 1 1 1 1 1
代表所有瓶子均可以有一种唯一情况表示,观察老鼠存货情况。
例子: 当老鼠为 “活死死活活死死” 时 即代表 0110011 = 51
四、其他相似题目
以下问题均为相似题目可供练手,
问题1:
有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
问题2:
有 8 个一模一样的瓶子,其中有 7 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 3 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
总结
老鼠喝水是一道经典算法面试题,但是转换为二进制思路会让你恍然大悟,算法只是一个思路。
希望这个博客能对你有所益处。我是轻王,我为自己代言。