1. 程式人生 > >Google的一道面試題的推廣(扔雞蛋不破的層數,2個,3個,n個雞蛋呢)

Google的一道面試題的推廣(扔雞蛋不破的層數,2個,3個,n個雞蛋呢)

1題目描述
google面試題:幾年前的Google的面試題在論壇炒得很火,今年又被人人網當作面試題了,題目如下:“有一個100層高的大廈,你手中有兩個相同的雞蛋。從這個大廈的某一層扔下雞蛋就會碎,用你手中的這兩個雞蛋,找出一個最優的策略,來得知那個臨界層面。”


人人網面試題:原題來自:2014人人網研發工程師內推面試題目
題目描述:
一幢 100 層的大樓,給你兩個雞蛋. 如果在第 n 層扔下雞蛋,雞蛋不碎,那麼從前 n-1 層扔雞蛋都不碎.
這兩隻雞蛋一模一樣,不碎的話可以扔無數次. 已知雞蛋在0層扔不會碎.
提出一個策略, 要保證能測出雞蛋恰好會碎的樓層, 並使此策略在最壞情況下所扔次數最少.
2.分析解答
2個蛋的時候的解答
    下面給出我的分析和解答。在此引用一下---解答Google的一道面試題---,具體分析可以連結進去看看,我直接用2個蛋的方法和結果。

    若有2個雞蛋,為使最壞的情況下投蛋次數最少,必須使各種情況最壞投蛋次數都相同(設需要t次),以此為突破點,將100層樓分成n段,分段點為1------a1------a2-----a3----...---an,an=99,若取a1=t,顯示若蛋在a1就碎了,那麼最壞還需t-1次就能找到臨界層,t-1+1=t。若在a1未碎,a2層碎了,那麼為保證最壞情況投蛋次數相同,第二段需要再投t-2次(因為已經投了2次),f-2+1+1=t...以此類推。第一段段長t,第二段段長t-1,第三段段長t-2,...一直到第n段段長為1。這樣才能 保證最壞情況投蛋次數最少且各種情況都相同。

t+(t-1)+(t-2)+...+1>=99(此處取99,因為題目已明確大廈某一層扔下雞蛋,蛋會碎,若99層蛋不碎,則100層必碎);

求和得(t+1)*t/2>=99,求得t>=14.

3總結和推廣(n個蛋的解答)
下面推廣3個蛋,4個蛋,n個蛋呢???

此時本題還是借鑑平衡樹(如AVL,紅黑樹,B樹)的思想,怎樣使最壞情況下的投蛋次數儘可能的均勻。最均勻的情況就是,最壞的情況下,各種最壞情況的投蛋次數都相同。當然還借鑑了B樹的分層檢索思想。

3個蛋其實就是多次分段的思想,和B樹的思想很像。目的使各種最壞情況的投蛋次數都為t次,下面分析方法:

假設第一次分段:1------a1------a2-----a3----...---an,an=99,若在a1層蛋碎了(已經投了1次),還剩下2個蛋,在1---(a1-1)內第二次分段(利用上面的結論,為使最壞情況投蛋次數為t次,此段內2個蛋需要t-1次(因為已投了1次),那麼需滿足,f(t-1)=(t-1+1)*(t-1)/2>=a1-1);

    同樣若蛋在a1層未碎,則在a2層投一次(假設蛋碎了),那麼在a1---(a2-1)內第二次分段(利用上面的結論,為使最壞情況投蛋次數相同,那麼在此段內2個蛋需要t-2次(因為已投了2次),那麼需滿足,f(t-2)=(t-2+1)*(t-2)/2>=a2-a1..

    以此內推,f(t-1)+f(t-2)+...+f(1)>=(a1-1)+(a2-a1)+..+(an-a..)=99,求最小的整數t。

    因此問題轉換為:f(t)=(t+1)*t/2,求最小的正整數t,使得f(t-1)+f(t-2)+...+f(1)>=99;程式設計很容易求得最小的t為9;即3個蛋時,最壞需要9次投彈。

    當然有了3個蛋的解法,程式設計實現4個蛋的解法,用同樣的思想遞迴就很容易實現了。

4 程式設計實現