算法面试题:扔玻璃杯的学问
扔玻璃杯的学问
问题简述
在算分研讨班上第一节课听到的有趣问题,据说是鹅厂面试题:
有一种玻璃杯质量确定但未知,需要检测。
有一栋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主页上的原文链接
算法面试题:扔玻璃杯的学问相关推荐
- 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...
- 微软的100道算法面试题(终结版)
前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法.五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的 ...
- 数据结构经典算法面试题
转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...
- [Z]谷歌(Google)算法面试题
谷歌(Google)算法面试题 1.谷歌面试题:给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数. 回答:此题的关键是让生成的 1 到 7 的数出现概率相同. 只要我们可 ...
- 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!
点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法. ...
- 常见的js算法面试题收集,es6实现
1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => {let string ...
- twitter java_Twitter算法面试题详解(Java实现)
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...
- prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」
欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...
- java面笔试_java笔试手写算法面试题大全含答案
java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...
最新文章
- python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)
- windows下安装python
- 秒杀系统必须考虑的 3 个技术问题!
- CentOS 6.5 安装与配置LAMP
- [c++]代理对象模式
- str计算机中代表什么,STR到底是待机还是休眠
- hyperion卫星重访时间_观摩卫星发射|2020第四届全球物联网大会上让我们一起去“放星”...
- bz2005 2005: [Noi2010]能量采集 数学题
- 说说 JavaEye 网站架构
- cmd运行jar时提示没有主类清单属性或找不到主类
- unity 获取设备的GPS信息
- 代写php代码作业,C++代写 CS 100 Project Two代做php实验作业
- 倒在转“码”路上的文科生
- [附源码]Python计算机毕业设计SSM绩效考核管理系统(程序+LW)
- 脉冲式和相位式激光测距
- oracle查询某个用户下所有表记录总数
- 王者荣耀扫码登录教程,扫码登录王者荣耀怎么弄?
- BZOJ4810 [Ynoi2017]由乃的玉米田
- java实现弹幕效果_css3实现蒙版弹幕功能
- python安装第三方库错误No matching distribution found for cfg
热门文章
- STM32F10x系列GPIO寄存器BRR、BSRR、ODR、IDR的使用理解
- MonoRail学习笔记四:MonoRail基本流程分析
- 如何理解什么是PHP接口,如何应用PHP接口?
- easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)
- 运行elevation_mapping流程记录
- postgresql之repmgr
- 多测师拱墅校区肖sir_高级金牌讲师_html讲解
- Linux运维之网络的配置,四种ip方式的设定,网关,dns的设定及物理机的网络连接
- 正确设定idea的java的jre环境和jdk
- 三分钟了解http和https