<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>

          【騰訊面試題】兔子試毒

          共 1648字,需瀏覽 4分鐘

           ·

          2021-10-01 09:40

          大家好,我是牛牛,經(jīng)過了忙碌的一周,終于盼來了周五。今天給大家分享一道有趣有料的算法題,希望能讓大家開啟周末的好心情。

          01
          故事起源

          有1000瓶藥水,其中有一瓶是毒藥,只要喝上一滴,一天之后就必死無疑。

          現(xiàn)在提供一批兔子來試毒,那我們怎么花最少的兔子、最少的時間,找出這瓶毒藥呢?


          02
          條件分析


          喝一滴就死掉,換句話說,那一瓶藥水是可以給多只兔子喝的。要花最少的兔子,又要花最少的時間,看起來像是時間與空間的決策,不如我們先來簡化問題:

          1.只追求時間,最快速度找出藥水。
          2.只追求空間,節(jié)約兔子,時間可以慢慢來。

          這樣從簡單角度輔助思考一下,也能為我們深入思考打下基礎(chǔ)。

          03
          花式試毒


          追求時間

          簡單來說,就是堆兔子。直接拿1000只兔子試毒,一只兔子負(fù)責(zé)一瓶藥水。結(jié)果自然是耗用1000只兔子,1天出結(jié)果。這樣的優(yōu)勢比較明顯,就是快;缺點也明顯:使用的兔子太多,占資源,不環(huán)保。



          追求空間

          如果我們出于環(huán)??紤],節(jié)約兔子,那么可以考慮用2分。第一輪就分為500瓶毒藥為一組,先放一只兔子,每瓶藥水喝一滴,這樣可以排除500瓶。如果活著,就繼續(xù)用這只兔子,如果死了,就補充兔子。我們按最壞情況來算:每次都要消耗掉一只兔子。

          下一輪250瓶,這樣循環(huán)迭代,1000->500->250->125->63->32->16->8->4->2->1

          10個箭頭,就是10次,也就是用了10天。這樣我們只用了10只兔子,很節(jié)約,不過就是等得太心慌。


          中庸之道

          把前兩種方式綜合一下,我們可以不用1000只兔子,也可以不用等足足10天。

          把2分,變成多分。比如,9只兔子的話,每次能分10份,每輪補充兔子到9只,這樣試完1000瓶藥水,只需要3天,1000->100->10->1。

          2只兔子的話,就是3份,1000->333->111->37->(12,12,13)->(4,4,5)->(2,2,1) -> 1

          規(guī)律也很明顯,天數(shù)為d,分a份,則兔子是a-1只,藥水N瓶,那么d等于以a為底N的對數(shù)(logaN)。比如,當(dāng)耗用2只兔子時,a為3,算出來正好是7天,和我們剛才的推算是一樣的。

          計算機思維

          還有沒有更好的辦法呢?時間短,效率高。

          當(dāng)然有,因為一次可以喝多瓶藥水,那么我們可以用10只兔子,模擬出1024種情況。

          給藥水編號,從1-1000,兔子也編上號,1-10號,1000瓶藥水編號,都轉(zhuǎn)換為二進制編號,1就是000 000 0001,1000就是111 110 1000。


          這種情況下,第幾位為1,就讓對應(yīng)的兔子喝一滴藥水。由于編號都是獨一無二的,所以最后根據(jù)死掉的兔子,反過來組合一下,就是藥水的編號。


          如此一來,10只兔子,只花1天,就能試毒成功。無論空間,還是時間,都是最快的。

          04
          兔兔復(fù)盤
          果你是使用1000只兔子試毒,那么說明你對時間很敏感;如果是二分法,那你一定是個節(jié)約成本的大師;如果使用多分法,說明你懂得在空間和時間上,取一個均衡,深諳中庸之道;如果你能很快想到二進制模擬,那么你一定是對計算機01存儲非常熟悉!

          是選擇時間?或空間?或?qū)で笃胶猓恳嗷蚴怯修k法另辟蹊徑,兩者兼?zhèn)洌肯嘈烹S著思維的循序漸進,你會有所感悟。

          今天分享的這道題不光有趣,還是大廠熱門面試題,看起來似乎很簡單,但其實是有巧思在其中的,它考察了你的思維方式和邏輯能力,希望大家在閱讀過程中有所收獲!



          END
          關(guān)注公眾號,免費領(lǐng)取學(xué)習(xí)資料
          你好,我是牛牛,普通二本畢業(yè)。
          本科進騰訊,去過外企,肝過頭條。
          目前回騰訊擔(dān)任高級工程師。
          想來騰訊的朋友,可以找我內(nèi)推哦!


          點個“贊”和“在看”鼓勵一下嘛~
          瀏覽 31
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  三级网址日本 | 性一交一乱一交视频 | 中文字幕乱伦大杂烩 | 亚洲一区豆花视频 | 国产黄色电影在线观看 |