小言_互联网的博客

面试官:如何用最少的老鼠试出有毒的牛奶?

403人阅读  评论(0)

面试题

有 n 桶牛奶,其中有 1 桶有问题,老鼠喝了后第二天会死掉。如何在最短时间内用最少的老鼠测出有问题的那瓶牛奶?

 

答案

如果  n 是 2 的整数次幂,就是 n 转换为二进制后的位数减一。如果 n 不是 2 的整数次幂,就是 n 转换为二进制后的位数。

即下面的计算

log2(n),如果是整数,那这个整数就是最少的老鼠。如果有小数,整取后并加1后的值为最少的老鼠数

 

操作方案

为了方便演示假设 n = 8,转换成二进制位 1000,可知需要最少的老鼠是 4 只,但因为 8 是 2 的整数次幂,其实最后只需要 3 只老鼠,我们先用 4 只老鼠说

 

第一步

给 8 桶牛奶用二进制编号

第 1 桶牛奶 0001

第 2 桶牛奶 0010

第 3 桶牛奶 0011

第 4 桶牛奶 0100

第 5 桶牛奶 0101

第 6 桶牛奶 0110

第 7 桶牛奶 0111

第 8 桶牛奶 1000

 

第二步

4 只老鼠按顺序排好,面对着牛奶对应的二进制编号,每桶二进制编号为 1 对应的老鼠喝牛奶

老鼠 1 喝第 8 桶的牛奶

老鼠 2 喝第 4、5、6、7 桶的牛奶

老鼠 3 喝第 2、3、6、7 桶的牛奶

老鼠 4 喝第 1、3、5、7 桶的牛奶

 

第三步

第二天后把这 4 只老鼠还按昨天的顺序排好,死了的老鼠标记为 1,没有死的老鼠标记为 0,这这样 4 只老鼠就组成了一个二进制的数,与之对应的牛奶编号就是有毒的那桶。比如老鼠 2 和老鼠 3 死了,对应的二进制编号为 0110,那就说明第 6 桶牛奶有毒

 

我们知道 n 为 2 的整数次幂的话,对应的二进制只有在最高位为1,也就是对应的第 n 桶牛奶只有一只老鼠喝,我们可以把这个老鼠省下来,用剩下的老鼠喝其余桶中的牛奶。如果这些老鼠都没死,那就说明是第 n 桶牛奶有毒了。

 

 

后记

这种题考查了对二进制的应用,也有很多变种面试题,但万变不离其宗,掌握了方法方可以不变应万变

这是一位网友的微信支付一面中遇到的题,我看到后,一点思路都没有,但有的朋友直接就把方案说出来了,可见平时积累的重要性

阅读推荐

原创|如果懂了HashMap这两点,面试就没问题了

cpu使用率过高和jvm old占用过高排查过程

老年代又占用100%了,顺便发现了vertx-redis-client 的bug

KafkaProducer源码分析

Kafka服务端之网络层源码分析

Redis 的过期策略是如何实现的?

原创|面试官:Java对象一定分配在堆上吗?

ThreadPoolExecutor 线程池"源码分析"

类加载器知识点吐血整理

三面阿里被挂,幸获内推名额,历经 5 面终获口碑 offer

原创|ES广告倒排索引架构演进与优化

广告倒排索引架构与优化

频繁FGC的真凶原来是它

原创|这道面试题,大部分人都答错了

同事:把"重试"抽象出来做个工具类吧


转载:https://blog.csdn.net/dam454450872/article/details/104438382
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场