微軟面試題:雞蛋從第N層及以上的樓層落下會摔破

題目:

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

 

形形色色的解答:

在參考下面的解答以前,請你先仔細思考10分鐘。看你給出的方案最小下落次數是多少。若是題目總分10分,看看本身能得幾分。測試

 

=========答案分割線=========spa

 

解答1:得0分的答案設計

 

用二分法。數學

 

這基本能夠說就是沒有經過大腦得出來的答案,並且還貌似很牛掰的樣子,並經常帶着一個lgn的複雜度。若是你接着問怎麼個二分法,他就答不上來了。方法

這個答案不是我杜撰出來的,而是我拿這個題目問過身邊的一些人,其中有幾我的真的隨口就把二分法給說出來了。每當我聽到二分法時,當我沒問。思考

 

解答2:得5分的答案block

 

若是咱們動一下腦子仔細思考這個問題,咱們會獲得一個相對不錯的答案。參加BAT面試那位朋友就給出了下面的這種方案,並自認爲是一種很完美的答案。但面試官給出的回答是:我仍是不滿意。分割

 

聽說,他這種思路的靈感來自於數學中的求極值問題。版本

 

已知兩個天然數的和爲25,求這兩個數的平方和的最大、最小值。

解:設一個天然數爲x 另外一個天然數爲25-x

x²+(25-x)²
=2x²-50x+625
=2(x²-25x+312.5)
=2[(x-12.5)²-156.25+312.5]
=2[(x-12.5)²+156.25]

因此可得:
當x取12.5時 有最小值2×156.25=312.5  (當x==y==12.5時取得極小值)
當x取25時 有最大值2×(12.5²+156.5)=625

 

所以,很容易獲得啓發(固然,這只是一種直覺,並無什麼理論依據。)。100層樓,平均分紅10分,每份恰好10層。

 

那麼咱們的作法以下:

 

將100層樓分紅10分,每一份就是10層樓。首先,將雞蛋從第10層樓開始扔。

 

那麼結果有兩種可能:


狀況1:若是碎了,說明臨界樓層在1到10之間,但如今只剩下一個雞蛋了,只能從第一層一直到第10層。
 

狀況2:若是沒有碎,接下來從第20層扔雞蛋。


該方法的思路是,用一個雞蛋來試探,找到臨界樓層的大體範圍[1~10]、[11-20]….[91-100]。而後用另外一個雞蛋在大體範圍內找出精確樓層。該方法的最壞次數是:18次。(本身去算,若是你算出來是17次,那就17次唄:))

 

解答3:得10分的答案

 

這是真正有理有據的解答。具體以下所述:

 

咱們先假設最壞狀況下,雞蛋下落次數爲x,即咱們爲了找出N,一共用雞蛋作了x次的實驗。 那麼,咱們第一次應該在哪層樓往下扔雞蛋呢?先讓咱們假設第一次是在第y層樓扔的雞蛋, 若是第一個雞蛋在第一次扔就碎了,咱們就只剩下一個雞蛋,要用它準確地找出N, 只能從第一層向上,一層一層的往上測試,直到它摔壞爲止,答案就出來了。 因爲第一個雞蛋在第y層就摔破了, 因此最壞的狀況是第二個雞蛋要把第1到第y-1層的樓都測試一遍,最後得出結果, 噢,原來雞蛋在第y-1層才能摔破(或是在第y-1層仍沒摔破,答案就是第y層。) 這樣一來測試次數是1+(y-1)=x,即第一次測試要在第x層。OK, 那若是第一次測試雞蛋沒摔破呢,那N確定要比x大,要繼續往上找,須要在哪一層扔呢? 咱們能夠模仿前面的操做,若是第一個雞蛋在第二次測試中摔破了, 那麼第二個雞蛋的測試次數就只剩下x-2次了(第一個雞蛋已經用了2次)。 這樣一來,第二次扔雞蛋的樓層和第一次扔雞蛋的樓層之間就隔着x-2層。 咱們再回過頭來看一看,第一次扔雞蛋的樓層在第x層,第1層到第x層間共x層; 第1次扔雞蛋的樓層到第2次扔雞蛋的樓層間共有x-1層(包含第2次扔雞蛋的那一層), 同理繼續往下,咱們能夠得出,第2次扔雞蛋的樓層到第3次扔雞蛋的樓層間共有x-2層, ……最後把這些互不包含的區間數加起來,應該大於等於總共的樓層數量100,即

 

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

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

 

得出答案是14。

 

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

 

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

 

好比,我第1個雞蛋是在第77層摔破的,那麼我第2個雞蛋就從第70層開始,向上測試, 第二個雞蛋最多隻須要測試7次(70,71,72,73,74,75,76),加上第1個雞蛋測試的 7次(14,27,39,50,60,69,77),最壞狀況只須要測試14次便可得出答案。

 

這個問題還有一個泛化的版本,即d層樓,e個雞蛋,而後設計方案找出N, 使最壞狀況下測試的次數最少。維基上給出了DP的解法,感興趣的話也能夠看看如下連接: 在第12章有比較詳細的介紹。

相關文章
相關標籤/搜索