前幾天,有個兄弟去大廠面試,回來跟我吐槽: **「Fox,字節二面把我問懵了!1000 瓶酒裡混了一瓶毒藥,用老鼠試毒,老鼠在喝完毒酒 1 小時後死亡,問最少幾隻老鼠能找出來?我當時腦子一熱說了 20 只,面試官笑笑沒說話,直接讓我回去等通知了……」**
其實這道題的正確答案是:10 只。
很多人聽到這個數字,第一反應是:這不可能!10 只老鼠,怎麼可能窮舉 1000 瓶酒的狀態? 如果你也停留在「一隻老鼠喝一瓶」的傳統思維,那在這道高併發、高壓縮的經典面試題面前,只能被面試官「降維打擊」。今天,Fox 就帶大家用程式設計師的底層邏輯(二進位與位元運算),徹底把這道題盤得明明白白!
大多數人卡在這道題上,是因為陷入了「流水線思維」——總想著讓老鼠一隻接一隻地去試,或者用老鼠的命去填。
但大廠面試官考的根本不是腦筋急轉彎,而是資訊理論與電腦底層儲存的本質:
這不就是天然的二進位(Binary)嗎?
一隻老鼠能表達 2 種狀態(0 或 1),兩隻老鼠能表達 2×2=4 種狀態。 那麼,10 只老鼠組合起來,能表達多少種狀態?
1024 大於 1000!這意味著,10 只老鼠所能組合出的生死狀態,完全能覆蓋 1000 瓶酒的所有編號!
明白了原理,具體怎麼操作?難道讓老鼠把幾百瓶酒混著灌下去?那老鼠還沒毒死先醉死了。
真正硬核的操作是:「微量取樣 + 標籤化並行測試」!

我們把 1000 瓶酒從 1~1000 進行編號,並把它們轉換成 10 位的二進位數:
00 0000 000100 0000 001000 0000 001111 1110 1000我們準備 10 個測試池,分別對應二進位的第 1 位到第 10 位。
規則非常簡單:看酒的二進位編號。如果某一位是 1,就從這瓶酒裡取一滴,滴入對應的測試池!
00 0000 0001 ):只有第 1 位是 1,取一滴只放入 1 號池。00 0000 0010 ):只有第 2 位是 1,取一滴只放入 2 號池。00 0000 0011 ):第 1 位和第 2 位都是 1,取兩滴分別放入 1 號池和 2 號池。11 1110 1000 ):第 4、6、7、8、9、10 位是 1,取樣本分別放入對應的 6 個池子。分流完成後,每個池子裡都混合了數百瓶酒的微量樣本,但彼此相互隔離。
我們請出 10 只老鼠工具人,排成一列。讓老鼠去喝對應編號的測試池!
老鼠 10(喝 10 號池) ... 老鼠 3(喝 3 號池) 老鼠 2(喝 2 號池) 老鼠 1(喝 1 號池)
由於 10 只老鼠是同時(高併發)喝各自的池子,一輪測試就全部搞定!
喝完之後,靜置等待毒發(假設毒藥有固定的潛伏期)。接下來就是見證奇蹟的時刻。
等結果出來後,我們把死了的老鼠記為 1,活著的老鼠記為 0。把 10 只老鼠的狀態按順序排成一個二進位數:
00 0000 0001 → 轉換為十進位是 1。第 1 瓶是毒酒!00 0000 0011 → 轉換為十進位是 3。第 3 瓶是毒酒!11 1110 1000 → 轉換為十進位是 1000。第 1000 瓶是毒酒!看到了嗎?老鼠的死亡組合,就是毒酒的絕對位址(指標)! 根本不需要多餘的老鼠,10 只老鼠的生死狀態,完美映射了 1000 瓶酒的每一個角落。
這道題表面上是邏輯腦筋急轉彎,但在架構師眼裡,它映射了極其核心的後端技術思想:
&、|、^、<< 這些位元運算都整不明白。這道題就是一塊試金石,一眼看穿你對電腦底層原理解析的敏感度。下次再去大廠面試,遇到這種問題,先別慌著去數數。記住,在電腦的世界裡,萬物皆可二進位!
歡迎關注「Fox 愛分享」,用最硬核的技術,帶你降維打擊每一次面試!按讚、在看、轉發,兄弟們安排一下!