經典面試問題 丟雞蛋

2021-10-03 23:34:13 字數 1009 閱讀 2200

扔雞蛋是一道經典的面試題,具體問題是給出 n (n>=2)個雞蛋,以及m層樓房(m>=n),要求計算最少需要多少次/平均需要多少次能得出雞蛋在第幾層正好摔碎。

這道題根據雞蛋的個數以及其他要求,衍生出了很多變種,這裡將整理部分題型及其思路。

一般來說,可以分為雞蛋(或玻璃球)有限制和無限制兩種情況,在無限制的情況下,題目一般要求給出最佳的求解方案;在有限制的情況下,題目一般要求給出平均丟擲次數最少的方案。

2.1 雞蛋個數無限制

我們先討論雞蛋個數無限制的情況。當可以無數次丟擲雞蛋來尋找正確層數時,這個問題就可以簡化為乙個查詢問題。而最快的查詢自然是二分查詢演算法,每次都以樓層的一半作為測試點,縮小查詢範圍。

2.2 雞蛋個數有限制

當然,更多的情況還是雞蛋個數有限制,最常見的有2個雞蛋和3個雞蛋。在這種情況下,雞蛋一旦摔碎意味著少了一次測試機會,因此需要解決的問題比無限制的情況更多。

2個雞蛋

3個或者更多個雞蛋

其實當這道題回歸到多個雞蛋求解時,就可以發現這其實是一道常見的動態規劃題目了。

按照動態規劃的步驟,首先我們要找出該問題的子問題是什麼。原始問題是求m層樓x個雞蛋,最壞需要投擲多少次才能檢測出雞蛋正好摔碎的樓層。當丟出乙個雞蛋之後,問題就減小為m-n層樓,用x/x-1個雞蛋最壞需要多少次,這裡的n是我們的劃分區域大小。

根據這樣的思路,再來考慮狀態轉移方程。假設當前在n層樓,還剩下x個雞蛋,表示為 f(n, x),那麼當前投擲雞蛋要是碎了,下乙個求解的問題可以表示為 f(n - 1, x - 1),如果沒碎,可以表示為 f(m - n, x)。那麼可得求最差結果的方程 f(n, x) = max( 1 + f(m-n, x), 1 + f(n - 1, x - 1))。

之後無論是用遞迴的方式還是陣列的方式都可以容易的計算出最差/平均投擲次數。

更詳細的分析和**這裡就不放了,但理解了動態規劃的思路,無論多少個雞蛋也能理解這個題型的用意了。

經典面試問題

1.對上萬個員工的年齡進行排序,時間複雜度不超過o n 空間複雜度為常數級別 特點 帶排序的值有乙個範圍 void sortage int age,int length 第i個位置存i歲的人的個數 for int i 0 i int index 0 for int i 0 ifor int j 0 ...

演算法 丟雞蛋問題

解題思路 首先是狀態表示,利用乙個二維陣列,兩個維度分別表示雞蛋的數量和樓層數。然後是狀態轉轉移,從低到高,雞蛋從少到多,遍歷每一種樓層和雞蛋數量的情況。在求每一種組合情況的時候,再從1遍歷樓層,求得對優解。雞蛋丟在每一層的情況都是碎或者沒有碎。先列舉雞蛋或者先列舉樓層都是可以的。這裡的時間複雜度是...

經典面試題樓層丟雞蛋問題的動態規劃解法與數學解法

原題 有2個雞蛋,從100層樓上往下扔,以此來測試雞蛋的硬度。比如雞蛋在第9層沒有摔碎,在第10層摔碎了,那麼雞蛋不會摔碎的臨界點就是9層。問 如何用最少的嘗試次數,測試出雞蛋不會摔碎的臨界點?注意 只有兩個雞蛋。第乙個雞蛋碎了,第二個雞蛋只能挨個樓層測試了。動態規劃解法 height為樓層數 co...