<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一道剛遇到的面試題,面試官說答不出正常

          共 1889字,需瀏覽 4分鐘

           ·

          2022-11-18 10:44

          大家周末愉快,今天分享一道很有意思的面試題目。

          面試官問這道題之前還說:不用緊張,基本上沒啥人可以答出來,你就發(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ù))。


          往期推薦

          項目啟動失???不用慌!

          別擔(dān)心,我們都一樣!

          有了這些 IDEA 插件,代碼拿捏!

          這幾個程序員必備畫圖工具,很實用!

          我的學(xué)習(xí)小圈子

          瀏覽 25
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷婷激情视频在线播放 | 精品久久伊人网 | 黄片一区 | 欧美激情五月天 | 麻豆一级A片久久久乱码 |