经典烧脑算法逻辑题--高楼扔鸡蛋:最少次数测出鸡蛋摔碎临界点

借雨醉东风 2024-04-22 19:34:49

关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;
有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》《做好面试准备,迎接2024金三银四》。 
图解《程序员面试常见的十大算法》及代码实现

-------------------------------------正文----------------------------------------

有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。

问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点?

-------------------------------------答案----------------------------------------

分析:

1.暴力法,最笨的测试方法。
把其中一个鸡蛋,从第1层开始往下扔。如果在第1层没碎,换到第2层扔;如果在第2层没碎,换到第3层扔.......如果第59层没碎,换到第60层扔;如果第60层碎了,说明不会摔碎的临界点是第59层。
在最坏情况下,这个方法需要扔100次。并且只需1个鸡蛋。

2.改良二分法。
采用类似于二分查找的方法,把鸡蛋从一半楼层(50层)往下扔。
如果第一枚鸡蛋,在50层碎了,第二枚鸡蛋,就从第1层开始扔,一层一层增长,一直扔到第49层。此时,是这种方法的最坏情况。最差仍需50次。
如果第一枚鸡蛋在50层没碎了,则继续使用二分法,在剩余楼层的一半(75层)往下扔第一枚鸡蛋,假如碎了,从第二枚鸡蛋从50-74层扔即可。

3.均匀法
如何让第一枚鸡蛋和第二枚鸡蛋的尝试次数,尽可能均衡呢?
很简单,做一个平方根运算,100的平方根是10。
因此,我们尝试每10层扔一次,第一次从10层扔,第二次从20层扔,第三次从30层......一直扔到100层。
这样的最好情况是第一枚在第10层碎掉,然后第二枚从1-9层尝试,共1+9=10次。
最坏的情况是在第一枚在90层碎掉,尝试次数为 9+9=18次。
有人问,最坏的情况为啥不是第100层?因为当第一枚在第90层还不碎的时候,90-100层时,还有2枚鸡蛋,此时可以用改良二分法。此时最坏只需9+5=14次。

4.改良均匀法
通过上面均匀法,我们知道最坏情况发生在第一枚鸡蛋试到第8次。
第一枚每多试一次,对应的最坏情况就多1次。我们如果能提升第一次的最坏情况,降低第8次的最坏情况,让第一枚无论何时碎,最坏情况都不增加就好了。
分析发现:如果下一次的间隔比第一次少1层,最坏情况就相等。比如:第一次10层,最坏情况是10次;第二次在19层(并且在这碎了),最坏情况就是2+8=10次。
因此,提升第一次的层数,并且降底后面每一次一层,应该大概率是OK的。而第一次是多少合适。经过分析发现,上面均衡法最优是10,最差是18,为了互相抵消每一次层升高带来的那1次最坏情况。把第1次的10和最后一次的18互相抵消到中位数14层。最坏情况就不会超过14。

即第1次14层,碎了,则第2枚1-13层依次试,最坏情况是14次;
如果没碎,第2次14+13=27层,最坏情况是2+12=14次。
第3次27+12=39层,最坏情况还是14次。
第4次39+11=50层;
第5次50+10=60;
第6次60+9=69;
第7次69+8=77;
第8次77+7=84;
第9次84+6=90;
第10次90+5=95;最坏情况依然是10+4=14次。
第11次95+4=99;最坏情况是11+1=12次。

如此,我们得到比上面均匀法更优的解,最差14次就能测出来。其实这个已经是答案了。因为我们用方程法去解,也是求得相同的答案。

5.方程法
我们假设第一次是在x层,根据上面分析,知道如果在x层就碎了,则最坏情况是x次[1+(x-1)],第一枚鸡蛋+第二枚从1层到x-1都要试。
根据上面分析,第二次是在x+(x-1)层试,如果碎了,最坏情况则依然是x次。
则最后一次是x+(x-1)+(x-2)+……1,最后一次刚好是第100层时,此时最优。则x+(x-1)+(x-2)+……1=100,即:(x+1)*x/2=100

最终x向上取整,得到x=14。和上面的结果一样。

第一枚鸡蛋的尝试楼层仍然是:

14,27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100

感兴趣的同学辛苦 关注/点赞 ,持续分享逻辑、算法、管理、技术、人工智能相关的文章。

博主其它经典原创:《管理心得--工作目标应该是解决业务问题,而非感动自己》,《管理心得--如何高效进行跨部门合作》,《管理心得--员工最容易犯的错误:以错误去掩盖错误》,《技术心得--如何成为优秀的架构师》、《管理心得--如何成为优秀的架构师》、《管理心理--程序员如何选择职业赛道》。及
C#实例:SQL如何添加数据》,《C#实战分享--爬虫的基础原理及实现》欢迎大家阅读。

...全文
186 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

290,187

社区成员

发帖
与我相关
我的任务
社区描述
欢迎加入几何心凉的前端社区,本社区活动丰富可以拿到众多周边礼物,本社区还对接Vue技能树可以更加系统的进行学习,还为大家定期举办博主成长计划,助您赢在CSDN同时带您遨游在前端技术的海洋中!!
前端学习经验分享 个人社区 北京·丰台区
社区管理员
  • 几何心凉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

诚挚的邀请大家加入几何心凉社区,在这里您可以结实挚友、提升技术、分享经验、成就自己

  • 【社区活动】本社区受官方长期扶持,您可以通过活动打造个人IP,让更多的人受益于您的分享,同时我们还会奉上精美周边;
  • 【赢在CSDN】社区会对社区成员开设博主扶持计划,集结优质博主分享成长经验,更是疑问在线解答,定期直播连麦,只要您是本社区成员皆可免费享受此权益,让我们携手共进助您速获万粉头衔;
  • 【Vue技能树】本社区创建人同时作为Vue技能树构建者,可为本社区开设技能树投稿通道,获得此权益后我们的高质量的文章被技能树收录获得更多曝光机会;
  • 【简历/就业指导】本社区创建者目前兼职高校就业指导,如果您是学生准备找工作或者您是职场人在应聘中遇到任何问题都可以在这里寻求帮助,我们会定期开设简历审查、面试技巧等就业方面的直播讲解;
  • 【技术交流】任何语言任何方向的技术文章我们都可以汇聚于此,大家可以摸鱼时间可以来此处提升自己,遨游在技术的海洋中;
  • 【立码吐槽】不管你是学生还是打工人,相信在生活中肯定有不断的新鲜事发生,这些事情可以是令你高兴的(比如今天过生日)可以是伤心的(比如我们丢了一个发卡)当然还会有很多,不满、发泄、求安慰等等,那么你可以在这个专栏中做出分享,求一句生日快乐、上岸顺利、加油老铁等等暖心的话;相信我们社区的伙伴看到后一定会速来吐槽;
  • 【bug记录】开发中的坑、学习中的雷,我们皆可投递于此,让更多的人借着分享精准避免从而高效开发;
  • 【更多】更多专栏正在筹备中。。。如果您是社区成员、如果您想为社区建设贡献力量,可以私聊社区管理员;

试试用AI创作助手写篇文章吧