您的位置:首页 > 职场人生

Google的一道面试题的推广(扔鸡蛋不破的层数,2个,3个,n个鸡蛋呢)

2014-09-08 15:07 387 查看

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个蛋呢???

此时本题还是借鉴平衡树(如***L,红黑树,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
编程实现

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: