扔玻璃杯的学问

问题简述

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

有一种玻璃杯质量确定但未知,需要检测。
有一栋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. python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)
  2. windows下安装python
  3. 秒杀系统必须考虑的 3 个技术问题!
  4. CentOS 6.5 安装与配置LAMP
  5. [c++]代理对象模式
  6. str计算机中代表什么,STR到底是待机还是休眠
  7. hyperion卫星重访时间_观摩卫星发射|2020第四届全球物联网大会上让我们一起去“放星”...
  8. bz2005 2005: [Noi2010]能量采集 数学题
  9. 说说 JavaEye 网站架构
  10. cmd运行jar时提示没有主类清单属性或找不到主类
  11. unity 获取设备的GPS信息
  12. 代写php代码作业,C++代写 CS 100 Project Two代做php实验作业
  13. 倒在转“码”路上的文科生
  14. [附源码]Python计算机毕业设计SSM绩效考核管理系统(程序+LW)
  15. 脉冲式和相位式激光测距
  16. oracle查询某个用户下所有表记录总数
  17. 王者荣耀扫码登录教程,扫码登录王者荣耀怎么弄?
  18. BZOJ4810 [Ynoi2017]由乃的玉米田
  19. java实现弹幕效果_css3实现蒙版弹幕功能
  20. python安装第三方库错误No matching distribution found for cfg

热门文章

  1. STM32F10x系列GPIO寄存器BRR、BSRR、ODR、IDR的使用理解
  2. MonoRail学习笔记四:MonoRail基本流程分析
  3. 如何理解什么是PHP接口,如何应用PHP接口?
  4. easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)
  5. 运行elevation_mapping流程记录
  6. postgresql之repmgr
  7. 多测师拱墅校区肖sir_高级金牌讲师_html讲解
  8. Linux运维之网络的配置,四种ip方式的设定,网关,dns的设定及物理机的网络连接
  9. 正确设定idea的java的jre环境和jdk
  10. 三分钟了解http和https