Google經典燒腦面試題 扔雞蛋問題思路整理

2021-08-21 06:42:56 字數 1549 閱讀 6460

問題:

有一棟樓,共100層。

定義:雞蛋在第n層樓扔下,不會碎,第n+1層扔下,會碎,那麼第n層就叫臨界樓層

你手中有兩個雞蛋(預設理想狀態:兩個雞蛋完全相同),如何優化嘗試策略,使得使用最少次數,測出臨界樓層

即,使用此策略,最差也可以在多少次以內測出臨界樓層

(ps:假定雞蛋一定會在某層樓下落後碎掉)

思路:

注意:手中只有倆雞蛋,必須要保證全碎之前測試出臨界樓層

1    為了不讓雞蛋碎掉,我們從一樓開始測試,這樣只需要乙個雞蛋,當到達臨界樓層的上一層n+1時,我們可以得出,n層是臨界樓層,這是最原始的方法,遍歷。

這種策略最糟糕的情況會是測試到100樓雞蛋才會碎,測試次數是100次,臨界樓層是99樓。最好的情況是測試到2樓雞蛋就碎了,測試次數是2次,臨界樓層是1層。

寫博不易,給個贊鼓勵一下吧

2    我們手中有倆雞蛋,為了充分利用條件,我們可以利用第乙個雞蛋來縮小範圍。

我們可以先跑到50樓去扔,沒碎的話,我們再去75樓去扔···直到第乙個雞蛋碎掉。

如果我們從50樓扔,沒碎,說明50樓以下是安全的,50樓以上還有50樓,那我們再去上面的50樓的一半——75樓去扔,在75樓碎了,說明臨界樓層在50層~74層之間,我們就利用第二個雞蛋,遍歷51層到74層。這是運用二分法

。這種策略最糟糕的情況會是50層雞蛋就碎了,49層是臨界樓層,測試次數是1+49次,臨界樓層是99樓。最好的情況是1樓是臨界樓層,測試次數是1+2次。

3    還有沒有更好的辦法呢?我們手中有兩個雞蛋,嘗試使每個雞蛋的測試任務大致相當,即給100開個平方根,第乙個雞蛋只測試整十樓層,第二個雞蛋測試兩個整十樓層之間的樓層。我們可以先測10樓,20樓,30樓···,直到第乙個雞蛋碎掉。

如果我們測到30樓,第乙個雞蛋碎了,那我們就用第二個雞蛋遍歷測試21~29樓。

這種策略最糟糕的情況會是99層是臨界樓層,測試次數是

10+9

次。最好的情況是1樓是臨界樓層,測試次數是1+2次。

點關注不迷路

4    這個時候我們產生了疑問,第三種方法是最好的策略嗎?我們怎麼驗證呢?

驗證這種事情,我們肯定要借助數學工具了。

首先,我們我們假定存在一種最優策略,最多n次測試就能找到臨界樓層

那麼,最糟糕的狀況會是哪一種呢?

從上面的分析可以看出,測試次數分為兩部分

第一顆雞蛋的測試次數x,用來縮小範圍

第二顆雞蛋用來在小範圍內查詢臨界樓層y

即x+y=n

那麼當測試次數固定為n時,每當x增加1,y則減少1

即,每當第一顆雞蛋測試一次,那麼所留給第二顆雞蛋探查的範圍就應該減少1

即n+(n-1)+(n-2)+······+3+2+1+0=100

解的n剛好為正整數14,即使用此策略最多探查14次即可在100樓中找到臨界樓層

另外,當探查總範圍發生改變時,解的n可能為小數,顯然,探查次數只能為整數且n越小探查總範圍越小,

即n應向上取整 

Google面試題 扔玻璃珠

某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞...

經典谷歌面試題 扔雞蛋問題

假如有100層樓,總共有2個雞蛋。需要多少次才能試探出臨界點,比如,在第三層扔下去,不碎 在第四層扔下去,碎了,那第三層和第四層就是臨界點。如果之前沒準備過的話,大概第乙個想到的就是二分法。1.二分法 首先在第50層丟第乙個雞蛋,若雞蛋碎了,則在第一層開始往上丟雞蛋,最壞情況是試探49 1次,為什麼...

經典面試題

1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...