前几天看到一个挺有意思的面试问题,据朋友说今年字节和Shopee都问过。
题目如下:

有2个鸡蛋,在总共有100层的楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。
问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点?

朋友给了一个文档,里面收集了一部分今年大厂的智力题和解答,对于这题有详细的分析和解答,但是并不全面,尤其是在确定第一次扔鸡蛋的楼层数上。
--------------------下面是我的解答,可供参考--------------------
(一)二分法

这题要求最少的尝试次数,就是想出一种方案,可以让测试次数最少,而且这个次数是该方案下最坏的情况所需的次数。

首先把一枚鸡蛋从一半的楼高即50层往下扔。
如果第一枚鸡蛋在50层高就碎了,那第二枚鸡蛋就只能从第1层开始扔,不然碎了就没鸡蛋了,然后一直往上加楼层,最坏的情况是扔到第49层,共计50次。

如果第一枚鸡蛋在50层没碎,则继续使用二分法,在剩余楼层的一半(75层)往下扔,然后再区分碎与不碎的情况。。。。。。

后面无论什么情况,这种方法在最坏情况就是50次,显然最少次数不会这么大。

(二)区间平分法

考虑到第一种方法次数那么多,而且主要是因为第一次扔的楼层很高,那能不能降低第一次扔的楼层高度呢,但是太低的话(比如一楼开始扔),后面又得花费很多次了。让我们先看看把100层均匀分成10分的情况吧。

第一次在10层的位置扔,如果碎了,就从一楼开始扔,这样就只需要十次;但是第一次扔如果没碎,那最坏的情况就是到第100层的时候鸡蛋碎了,此时已经扔了10次(10,20,30…100),那就只能拿第二个鸡蛋从91层开始,一直到99,这样共计是19次。

我当时还想到,要是在第90层没碎的话,那就把90到100间二分一下,第二次从95层扔,要是碎了,那第二个鸡蛋就从91,92,93,94,总共14次,要是没碎,就继续二分,但关键就是,万一在第90层的时候就碎了呢,或者在第80层的时候就碎了呢,这个题目要给出最少次数,必须得考虑所有最坏的情况。

第一个鸡蛋碎与不碎、第一次扔的楼高、第二次,第三次以及后面每一次扔鸡蛋的楼高都能明显影响结果,既然情况这么复杂,那干脆就直接假设本题中最少尝试次数为x次,即鸡蛋硬度测试的最优方案下的最大次数是x次。

(三)假设法

这是一种逆行解法,我们假设已经知道最少尝试次数为x次。那么我们需要进一步确认第一次在哪一层扔鸡蛋。

1.显然,第一次扔的层数不能大于x,即不能从x+1及更上面的楼扔,因为如果第一个鸡蛋碎了,后面又得从一楼开始扔,这时尝试次数就是x+1及更大的数(比如第一次在第x+1层扔,碎了,那第二个鸡蛋最坏情况下得从1楼扔到x层,此时共计尝试1+x次),这与我们的假设相违背。

2.既然x次是最优方案最坏的情况,那我们干脆第一次在第x层扔。若第一个鸡蛋碎了,那最坏情况就是就从1楼一直扔到x-1楼,共计1+(x-1)=x 次。那如果没碎,怎么保证后面总计次数不超过x次呢?

按照上面的逻辑,第二次扔鸡蛋的楼高不能超过 x+(x-1),因为前面已经用过一次机会了,后面不能超过x-1次。此时最坏的情况就是,第一次在x层扔鸡蛋没碎,第二次在x+x-1层扔时碎了,那就得从第x+1层往上扔,这样总共次数为1+x-1=x次,没有超过,而且刚好为x次,按照这个逻辑,后面继续保持最少尝试次数为x次去找楼层(因为我们要考虑最坏的情况,在这个情况下,次数为x次)

那第三次就是只剩下x-2次机会,那我们在第
**x+(x-1)+(x-2)**层扔。一直扔到100。那么就有:

x+(x-1)+(x-2)+(x-3)+…+1 = 100 (1)

//最后一项为1是因为最后肯定会只剩1次尝试机会,若鸡蛋只在100层碎,那么左边加起来就是100,即最后一次扔鸡蛋是在第100层

按照前面每次选楼层的逻辑,此时总共尝试的次数就是x次,所以左边是x项。
则有数列求和

*(x+1)x / 2 = 100 (2)

解出x为小数,向上取整为x = 14。

//因为x得往大取整,(1)式左边才会大于100。又或者试想一下,左边项数必须小于x次,列出不等式(1)≤ *(x+1)x / 2,解出x > 13.72

那么这个时候,每次扔鸡蛋的楼层可以取值为

14,27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100
共12个数

可以尝试验证,比如鸡蛋在68层会碎,则在69时碎了,此时尝试6次,再拿第二个鸡蛋从61开始到68碎了,此时8次,共计14次,这时得到鸡蛋不会碎的临界层数是67层。

3.如果第一次扔的层数不是x次呢,显然也是可以的,比如x-1层,大家可以按照2的思路尝试算一下,发现x解出来也是14。我们可以假设第一次在第14-m层扔鸡蛋,后面也是按照2的思路,第二次只有13次机会,所以从**(14-m)+13**层扔,依次类推,可以解出105-m ≥ 100,所以m ≤ 5,即第一次从14、13、12、11、10、9层扔都是可以的。
如果第一次从第9层开始扔,那么每次的层数取值可以为

9、22、34、45、55、64、72、79、85、90、94、97、99、100
总共14个数

可以验证最大次数也是14。

4.扩展

如果第二次不按照x+x-1层来扔呢,而是按照小于这个层数来扔会怎么样,其实一样的,后面也是能变化的,但是最后加起来也是100,并且保证扔鸡蛋的次数最多还是14次,这样后面的层数也不能选太小,可见扔鸡蛋的方案还是很多的并不止
14,27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100 这一种

感觉这个假设法并不一定逻辑最严密,可能还有更严谨的解法。

【经典算法题】用两个鸡蛋和100层的楼来测鸡蛋硬度相关推荐

  1. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...

  2. 经典算法题每日演练——第十九题 双端队列

    经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...

  3. 经典算法题每日演练——第十题 树状数组

    原文:经典算法题每日演练--第十题 树状数组 有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序 假如我现在有个 ...

  4. python全排序算法题_Python的100道经典算法题(1)

    按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...

  5. java经典100例算法题_10道java经典算法题,每一题都能帮你提升java水平!

    JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子 ...

  6. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  7. 【经典算法题】二叉树的最近公共祖先

    [经典算法题]二叉树的最近公共祖先 Leetcode 0235 二叉搜索树的最近公共祖先 题目描述:Leetcode 0235 二叉搜索树的最近公共祖先 分析 本题的考点:LCA(最近公共祖先). 关 ...

  8. 【经典算法题】水壶问题

    [经典算法题]水壶问题 Leetcode 0365 水壶问题 题目描述:Leetcode 0365 水壶问题 分析 本题的考点:数学.欧几里得算法. 两个水壶记为A.B.A.B这两个水壶都是及不空也不 ...

  9. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

最新文章

  1. pythonweb开发-5个最好的Python Web开发框架
  2. L. Continuous Intervals(单调栈 + 线段树 + 思维)
  3. 云+X案例展 | 传播类:k3s基于逾百台工控机的应用实践
  4. SQL Server日期格式和SQL Server转换举例说明
  5. Python使用装饰器捕获异常
  6. 【网络安全工程师面试合集】— 网络攻防技术演化历程
  7. 某大型银行深化系统技术方案之十六:业务应用层
  8. [USACO13JAN]Square Overlap【模拟】
  9. 网页版Rstudio︱RStudio Server多人在线协作开发
  10. CVR预估模型-ESMM
  11. 【转】其他人的BUG
  12. Excel表结构模板生成MySql建表语句
  13. [Xilinx FPGA] #1 Xilinx ISE 工程开发全流程笔记
  14. 手撕神经网络(1)——神经网络的基本组件
  15. putty下载安装教程
  16. linux 判断u盘 硬盘坏道,u盘怎么检测硬盘坏道
  17. 用Latex输入微米(micron)或者微秒的方法
  18. away3D操纵三维物体详解
  19. 如何快速创建在线员工培训课程
  20. 求QQ自动登录解决方案

热门文章

  1. WPF与3D 模型(一)把Solidworks里的模型导入进WPF程序
  2. 用pageOffice插件实现 word文档在线填充指定数据
  3. 统计各个分数段的人数python_怎么利用Excel统计各分数段的人数
  4. 【Linux服务器】登录Linux服务器后,登陆信息显示佛祖保佑、永不死机,小猪佩奇等图案
  5. C语言编译器开发之旅(二):解析器
  6. Adv-Makeup:一种新颖不易察觉且可迁移的人脸识别攻击方法
  7. java中x--与--x_GitHub - xsonorg/xco: XSON Common Object
  8. 【阿里天猫精灵专题】TB-02 RGB冷暖灯控制
  9. 深蓝算法反演AOD入门记录(一)
  10. linux断网过一段时间就好了,网络总是隔一段时间丢包或者不通,过10分钟就好了?求解决 - 思科技术论坛 - 51CTO技术论坛_中国领先的IT技术社区...