经典谷歌面试题-扔鸡蛋问题
假如有100層樓,總共有2個(gè)雞蛋。需要多少次才能試探出臨界點(diǎn),比如,在第三層扔下去,不碎;在第四層扔下去,碎了,那第三層和第四層就是臨界點(diǎn)。?
如果之前沒(méi)準(zhǔn)備過(guò)的話,大概第一個(gè)想到的就是二分法。
1. 二分法
首先在第50層丟第一個(gè)雞蛋,若雞蛋碎了,則在第一層開(kāi)始往上丟雞蛋,最壞情況是試探49+1次,為什么要從第一層開(kāi)始嘗試呢,因?yàn)橹挥?個(gè)雞蛋;若雞蛋沒(méi)碎,則在75層丟第二次,若碎了則在(50,75)區(qū)間從下往上嘗試。。。
結(jié)論:二分法最壞嘗試次數(shù)是50次。
顯然二分法不是一個(gè)好的解決方案,這里介紹第二種方法“平方根法”。
2. 平方根法
因?yàn)?00是10的平方,我們可以把10作為一個(gè)區(qū)間去嘗試,即第一層在第10層丟,碎了,則需在[1,9]之間嘗試;不碎,則去第20層丟。。。,一直到第90層丟,還不碎的話,則在[91,100]層逐一嘗試,最壞情況是9+10=19次,19次了,比二分法要前進(jìn)了一半以上了。并且平方根法還可以再優(yōu)化一下:以15層作為起點(diǎn),步伐是10。即第一層是15,第二次是25,第三次是35,45…95。這種優(yōu)化后的呢,最壞情況下,是在第9次(第95層碎),然后在(85,95)區(qū)間嘗試9次,即優(yōu)化后的最壞嘗試次數(shù)是9+9=18次。
結(jié)論:平方根法最壞情況下是19次,平方根優(yōu)化法最壞情況下是18次。
3.解方程法
這里介紹下解方程法,算法的思想呢是假設(shè)最優(yōu)解是x次,第一次扔的樓層也是x層。為什么第一層扔的樓層也要是x層呢?因?yàn)槿绻顑?yōu)解成立
①當(dāng)?shù)谝淮稳拥臉菍邮莤+1層時(shí),若碎了,則需要在[1,x]層里依次嘗試,最壞情況是在x層碎,即嘗試總次數(shù)是:1+x次,和假設(shè)不符;同理,第一次在x+1層上面的話總次數(shù)只會(huì)更多
②當(dāng)?shù)谝淮稳拥臉菍邮莤-1層時(shí),若碎了,則需要在[1,x-2]層里依次嘗試,最快情況是在x-2層碎,即嘗試總次數(shù)是:1+x-2=x-1次,和假設(shè)不符;同理,第一次在x-1層下面的話,總次數(shù)只會(huì)更少
綜上所述,假設(shè)最優(yōu)解是x次時(shí),第一層扔的樓層也得是x層。
開(kāi)始扔雞蛋了
? ? ? ? 第一次是在x層扔雞蛋,結(jié)果也就兩種情況:蛋碎,蛋不碎
? ? ? ? 蛋碎了,那么加下來(lái)只需在[1,x-1]之間扔雞蛋即可,最壞需要x-1次,總次數(shù)即1+x-1=x次
蛋不碎
第二次得在(x,100]區(qū)間內(nèi)扔雞蛋了,具體是哪一個(gè)層呢?應(yīng)該是在x層上的x-1層。為什么是x-1層呢?因?yàn)閇1,100]區(qū)間,嘗試次數(shù)是x次,在x層不碎,則問(wèn)題轉(zhuǎn)化成了在(x,100]層,最優(yōu)解是x-1次,同理,扔雞蛋的最優(yōu)樓層數(shù)也得是x層上的x-1層。
第三次得再加x-2層扔
第四次得再加x-3層扔
以此類推…
轉(zhuǎn)化成方程式是: x + (x-1) + (x-2) + (x-3) + … + 2 + 1 = 100,左邊的都能理解,右邊的為什么是100呢?因?yàn)闃菍邮?00層,方程式的左邊肯定小于等于100,取最壞情況那就是方程式右邊是100。
根據(jù)等差數(shù)列求和公式Sn=n(a1+an)/2 ,x向上取整得14,即第一次在14層扔,第二次是在 14+(14-1)=27層,后面依次是39,50,60,69,77,84,90,95,99,100
所以嘗試的最優(yōu)解為
14,27,39,50,60,69,77,84,90,95,99,100
按照這種辦法嘗試,無(wú)論哪種情況下,我們的最壞嘗試次數(shù)都不會(huì)超過(guò)14次
舉例1:在14層碎了,我們只需嘗試[1,13]層之間,每層扔一下即可,最壞情況在13層才碎,也就是一共嘗試14次
舉例2:前面都沒(méi)碎,在39層碎了,那么我們需要在(27,38]層之間,每層扔一下即可,最壞情況在38層才碎,也就是一共嘗試前面3次(14,27,39層)+后面11次=14次
舉例3:前面都沒(méi)碎,在99層碎了,那么我們需要在(95,98]層之間,每層扔一下即可,最壞情況在98層才碎,也就是一共嘗試了前面11次(14,27,39,50,60,69,77,84,90,95,99層)+后面3次=14次
舉例4:前面都沒(méi)碎,在100層碎了,那就更簡(jiǎn)單了,因?yàn)榍懊娴?9層沒(méi)碎,直接可得結(jié)論,99-100層是臨界點(diǎn),嘗試總次數(shù)只有12次(14,27,39,50,60,69,77,84,90,95,99,100層)
綜上抽檢
無(wú)論哪種情況下,都可以做到最壞14次找到臨界點(diǎn)
總結(jié)
以上是生活随笔為你收集整理的经典谷歌面试题-扔鸡蛋问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: git知识总结
- 下一篇: 万能makefile深入浅出 - 第四篇