經典面試題23 - 扔雞蛋的技巧

問題

有一棟100層的高樓,一個雞蛋從第N層及以上的樓層落下來會摔破, 在第N層以下的樓層落下不會摔破。給你2個雞蛋,設計方案找出N,並且保證在最壞情況下, 最小化雞蛋下落的次數。(假設每次摔落時,如果沒有摔碎,則不會給雞蛋帶來損耗)

解答

這完全是一道智力題,和所謂的編程算法無關,不要走進二分法的陷阱,歸納法纔是爭取選擇。

首先假設在最壞情況下,雞蛋下落次數爲x,我們爲了找出N,一共用雞蛋做了x次的實驗。

那麼,我們第一次應該在哪層樓扔雞蛋呢?

先讓我們假設第一次在第y層樓扔的雞蛋, 如果第一個雞蛋在第一次扔就碎了,我們就只剩下一個雞蛋,要用它準確地找出N, 只能從第一層向上,一層一層的往上測試,直到它摔壞爲止,這時候答案就出來了。

由於第一個雞蛋在第y層就摔破了, 所以最壞的情況是第二個雞蛋要把第1到第y-1層的樓都測試一遍,最後得出結果:
原來雞蛋在第y-1層才能摔破, 或是在第y-1層仍沒摔破,答案就是第y層。

這樣一來測試次數是1+(y-1)=x,即第一次測試要在第x層。

如果第一次測試雞蛋沒摔破呢,那N肯定要比x大,要繼續往上找,需要在哪一層扔呢?

我們模仿前面的操作,如果第一個雞蛋在第二次測試中摔破了, 那麼第二個雞蛋的測試次數就只剩下x-2次了(雞蛋總共下落次數爲x,而第一個雞蛋已經用了2次)。

這樣一來,第二次扔雞蛋的樓層和第一次扔雞蛋的樓層之間就隔着x-2層。

我們再回過頭來看一看:
第一次扔雞蛋的樓層在第x層,第1層到第x層間共x層;
第1次扔雞蛋的樓層到第2次扔雞蛋的樓層間共有x-1層;
同理繼續往下,我們可以得出,
第2次扔雞蛋的樓層到第3次扔雞蛋的樓層間共有x-2層;
第3次扔雞蛋的樓層到第4次扔雞蛋的樓層間共有x-3層;
……

最後把這些互不包含的區間數加起來,應該大於等於總共的樓層數量100,公式如下:

x + (x-1) + (x-2) + ... + 1 >= 100
(x+1)*x/2 >= 100

解方程可知 x = 14。

即先用第1個雞蛋在以下序列表示的樓層數不斷地向上測試,直到它摔破。 再用第2個雞蛋從上一個沒摔破的序列數的下一層開始,向上測試, 即可保證在最壞情況下也只需要測試14次,就能用2個雞蛋找出從哪一層開始, 往下扔雞蛋,雞蛋就會摔破。

14, 27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100

比如,我第1個雞蛋是在第69層摔破的,那麼我第2個雞蛋就從第61層開始,向上測試, 第二個雞蛋最多隻需要測試8次(61,62,63,64,65,66, 67,68),加上第1個雞蛋測試的 6次(14,27,39,50,60,69),最壞情況只需要測試14次。

更多

經典面試100題 - 持續更新中

獲取更多內容請關注微信公衆號豆志昂揚:

  • 直接添加公衆號豆志昂揚
  • 微信掃描下圖二維碼;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章