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

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

面試題

有 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 桶牛奶有毒了。


後記

這種題考查了對二進制的應用,也有很多變種面試題,但萬變不離其宗,掌握了方法方可以不變應萬變

這是一位網友的微信支付一面中遇到的題,我看到後,一點思路都沒有,但有的朋友直接就把方案說出來了,可見平時積累的重要性


分享到:


相關文章: