一道剛遇到的面試題,面試官說答不出正常
大家周末愉快,今天分享一道很有意思的面試題目。
面試官問這道題之前還說:不用緊張,基本上沒啥人可以答出來,你就發(fā)散著想想就行。
好了,廢話不多說了,我們直接上題。
題目
現(xiàn)在有 10 只小白鼠和 1000 支藥水,1000 支藥水中有且僅有一支藥水有毒,如果小白鼠喝下毒藥,那么毒發(fā)的時間是兩小時。
現(xiàn)在只給你兩小時的時間,請問如何用這 10 只小白鼠測出哪支藥水有毒?(忽略小白鼠喝藥的時間)。
思考
當(dāng)時聽完這題,我第一反應(yīng)是:這題是不是在逗我?
就 10 只小白鼠,喝 1000 支藥水,那么一只小白鼠肯定要喝多支藥水,假設(shè)某只小白鼠兩小時后死了,我怎么確定它到底是因為喝了哪支藥水死的?
我直接把我的這個想法跟面試官說了,我說這題目是不是有問題,面試官微微一笑,他說題目沒問題,你再想想。
再想想
看到這,不知道諸位是否有啥想法,期間面試官給了我一個提示:10 如何能代表 1000 ?
這里建議先想個兩分鐘,各位再思考思考,沒啥思路再看我下面的解答。
解答
不賣關(guān)子了,反正我當(dāng)時沒想出來,哈哈,一下子聯(lián)想不到那里,但是這題聽完答案之后又會豁然開朗。
10 如何能代表 1000?重點就是這個提示,其實就是二進(jìn)制。
10 只小白鼠,我們分別給它們編號,從 0-9。

每只老鼠喝下藥水,最終的結(jié)果要么是生,要么是死,所以有兩種狀態(tài)。
看到這是不是有點感覺了?
兩種狀態(tài)就是二進(jìn)制的 0 和 1。
如下圖所示:

所以,每只小白鼠有兩種狀態(tài),那么 10 只小白鼠聯(lián)合起來,2 的 10 次方是 1024,當(dāng)然可以表示 1000 個數(shù)字了。
然后我們給每只藥水編號,從 0-999。
好了,操作來了:
0 二進(jìn)制表示,是 0000000000
1 二進(jìn)制表示,是 0000000001
2 二進(jìn)制表示,是 0000000010
3 二進(jìn)制表示,是 0000000011
..........
999 二進(jìn)制表示,是 1111100111
可以看到我把藥水編號轉(zhuǎn)成二進(jìn)制,一共寫了 10 位,每一位其實就表示對應(yīng)一只小白鼠喝不喝這個藥水。
就是說第 0 個小白鼠,把藥水編號第 0 位是 1 的藥水都喝一遍。
第 1 個小白鼠,把藥水編號第 1 位是 1 的藥水都喝一遍。
第 2 個小白鼠,把藥水編號第 2 位是 1 的藥水都喝一遍。
...
第 9 個小白鼠,把藥水編號第 9 位是 1 的藥水都喝一遍。
這樣設(shè)計之后,除了第 0 瓶藥水,其它藥水都有小白鼠喝了,所以如果沒有小白鼠死亡,那么第 0 號藥水有毒。
那么,如果有小白鼠死亡該怎么判斷?
其實很好理解,假設(shè)現(xiàn)在是編號 3 的藥水有毒,我們得知編號 3 的二進(jìn)制是:0000000011
叢上面的規(guī)則我們知道,有且僅有第 0 個和第 1 個老鼠喝了編號 3 這個藥水,所以如果別的老鼠都沒死,只有這兩個老鼠死了,那么我們可以斷定編號 3 藥水是毒藥。
所以,我們讓對應(yīng)的老鼠喝對應(yīng)的藥水,然后兩小時之后觀察哪幾只老鼠死亡,我們就可以從死亡的老鼠編號反推出毒藥的編號。
假設(shè)現(xiàn)在第 0、1、3、5 老鼠死了,那么毒藥水編號就是:2^0 + 2^1 + 2^3 + 2^5 = 1 + 2 + 8 + 32 = 43。
好了,解答完畢。(其實這個題干應(yīng)該再補(bǔ)充下,每支藥水量充足,足夠每只小白鼠喝一口)
現(xiàn)在想想這個方式是不是有點巧妙?有點拓寬思路的感覺。
最后
這道題看起來好像是智力題,其實給了提示之后就是考察對二進(jìn)制的掌握程度了。
二進(jìn)制其實在很多場景都有比較深入的運(yùn)用,其實就是位域的用法。
我舉個距離我們比較近的例子,Java里面的讀寫鎖即ReentrantReadWriteLock。
AQS 里面用一個 int 變量 state 來表示鎖的占有,那一個變量同時如何表示讀鎖和寫鎖呢?
int 是 4 個字節(jié),一共 32 位,于是乎李老爺子就把 32 位分為了兩部分,高 16 位表示讀鎖的狀態(tài),低 16 位表示寫鎖的狀態(tài)。
這就是二進(jìn)制的一個簡單應(yīng)用,當(dāng)然還有很多,包括刷算法題的時候,通過位來節(jié)省內(nèi)存開銷等等,這里就不多說了。
對了,不知道你們是否在路邊遇到過擺攤的算命先生,說讓你指著前面幾張紙就能知道你的姓氏,其實用的就是二進(jìn)制!
然后,你們在面試中有遇到什么比較有趣的面試題嗎?歡迎留言分享下!
歡迎學(xué)編程的朋友們加入我的 編程知識星球 ,我會 1 對 1 解決你的問題,并且直播帶大家開發(fā)完整項目(第三期項目進(jìn)行中,本周日繼續(xù))。
往期推薦
