扔玻璃杯的学问

问题简述

在算分研讨班上第一节课听到的有趣问题,据说是鹅厂面试题:

有一种玻璃杯质量确定但未知,需要检测。
有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎。
现给你两个杯子,问怎样检测出这个杯子的质量,即找到在哪一层楼刚好会碎?

思路

暴力:

​ 拿一个杯子从第一层开始往上一直扔,一定能找到答案。最坏需要99次。

​ 似乎暴力得过头了,而且只用到一个杯子。

改进:

​ 分区间扔,充分利用两个杯子。先从第10楼扔,再从第20楼扔,依次下去,如果到某一层碎掉,比如50层碎掉了,我再从41楼开始扔。这样最坏只需要19次。

目前能找到的最佳算法:

继续思考刚才方法的缺陷:

当杯子质量比较差的时候,此方法还是比较快速的找到的。比如杯子是在19楼刚好碎,我只需要扔11次,比99楼刚好碎的情况要少很多次。

所以我们的愿望是:
杯子的质量无论分布在哪个查找区间,都可以快速地找到。所以我想到的是可以“匀”一下刚才的方法。即 最开始我需要大胆地扔,然后再慢慢小心地扔。

具体方法设计:
每次扔的区间减少一层,这样做可以保证每个区间查找的最差次数是一样的。
假定第一步在15楼扔,没碎的话则下一步在29楼扔,没碎下一步在42楼扔…碎掉之后则在上一次没碎的楼层开始向上扔。那么最开始在哪一层开始扔呢??
这里我们需要拿支笔算一下:
x+(x-1)+(x-2)+…+2 >=100
求解出答案为14。

即最终给出的解决方案是:
最开始从14楼开始扔,没碎的话在27楼扔,再没碎的话在39楼扔…一旦碎掉,则从上一次没碎的楼层逐层往上扔,即可快速确认杯子在哪一层刚好会碎掉。

这样的方法可以保证在最差的情况下也能在14次内找到楼层,平均需要的次数不到10次。

技亦灵怪矣哉,算法的trick令人惊叹。
我的github主页上的原文链接

算法面试题:扔玻璃杯的学问相关推荐

  1. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  2. 微软的100道算法面试题(终结版)

    前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法.五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的 ...

  3. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

  4. [Z]谷歌(Google)算法面试题

    谷歌(Google)算法面试题 1.谷歌面试题:给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数. 回答:此题的关键是让生成的 1 到 7 的数出现概率相同. 只要我们可 ...

  5. 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!

    点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法. ...

  6. 常见的js算法面试题收集,es6实现

    1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => {let string ...

  7. twitter java_Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  8. prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  9. java面笔试_java笔试手写算法面试题大全含答案

    java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...

最新文章

  1. 强烈推荐7个让人惊艳的宝藏实用网站,太好用了
  2. [数字图像处理]图像去噪初步(1)--均值滤波器
  3. 调用WCF返回Josn的两种方式
  4. elasticsearch报错expected block end, but found BlockMappingStart解决方法
  5. EFCore3.1+编写自定义的EF.Functions扩展方法
  6. Android之在Java socket作为服务器里面返回数据头部怎么写入浏览器需要下载文件的文件名
  7. ios html 禁止下拉,ios禁止页面下拉
  8. c语言双链表从右向左遍历,有没有大佬在的,我这双向链表怎么没办法遍历
  9. 若干排序算法简单汇总(二)
  10. virtuoso根据原理图绘制版图并联接_Cadence教程2——反相器原理图仿真以及版图绘制...
  11. CSDN会员服务协议
  12. CodecContext-gop_size 是什么
  13. python面试题搜集
  14. MAVEN(一)——配置以及plugins
  15. mysqli_connect(): (HY000/2002):
  16. 南宁师范大学计算机考研资料汇总
  17. 探索Google App Engine背后的奥秘(1)--Google的核心技术(转帖)
  18. RPA中国流程自动化产业峰会火热报名中...
  19. Matlab缩放曲线局部窗口
  20. 小米笔记本Air 13.3 熄屏 大概率无法唤醒问题(已解决)

热门文章

  1. unity读取Texture文件并转为Sprit
  2. C10K问题与IO多路复用
  3. 5 个常用 Python 标准库
  4. 机器学习之用Python梯度下降法实现预测
  5. Python语法--File文件处理
  6. Java9、10、11、12、13、14、15、16、17个版本新特性
  7. c语言中哪个键是逐行运行的,c语言中的快捷键有哪些?
  8. 判断ip地址是否在同一网段
  9. 2019华师在线计算机,华师计算机基础客观作业2019.pdf
  10. 解决浏览器能上网而其他软件无法联网的问题