这是一道 Google 面试题,考察的是对于 粗调精调 工程思维

对于扔玻璃球国内也叫扔鸡蛋。

ta不用您有什么基础,只需要一个基本工程思维。

粗调和精调,这个已是统计学里最优法,所以不用担心复杂度,精力应放在怎么设计更好的粗调和精调方法,以减少次数。

那么,什么是 粗调和精调 呢??

  • 机械加工可能需要调一个非常精准的数字如 20.0008 的值。
  • 这个机械加工难度如拿望远镜,要调到 20.0008精度 。

第一个是粗调,您得大致对准20,第二个是精调,您能对准00008【手术机器人的精度控制同理】。

本质 :设计各种粗调和精调的方法。

一大波思维修炼来袭:

给你两个一模一样的玻璃球。这两个球如果从一定高度掉到地上就会摔碎,当然,如果在这个高度以下往下扔,怎么都不会碎,超过这个高度肯定就一次摔碎了。
现在已知这个恰巧摔碎的高度范围在1层楼到100层楼之间。如何用最少的试验次数,用这两个玻璃球测试出玻璃球恰好摔碎的楼高。

为了便于你理解这道题,我不妨讲两个具体的策略。

第一个策略:是从第一层楼开始,一层一层往上试验。 你拿着球跑到第一层,一摔,没有碎,接下来你又跑到第二层去试,也没有摔碎。你一层层试下去,比如说到了第59层摔碎了,那么你就知道它摔碎的高度是59层。这个策略能保证你获得成功,但显然不是很有效。

第二个策略:是预测一下,试一试, 你跑到30层楼一试,没有碎,再跑到80层楼一试,碎了。虽然你把摔碎高度的范围从1-100减小到30-80,但接下来你就犯难了,因为你就剩一个球了,再这样凭感觉做试验,可能两个球都摔碎了,也测不出想知道的高度。

这道题好的方法是什么呢?


俩个球,一个用来做粗调,一个用来做精调,具体做法是以下这样的。

一种符号正常思维的 粗调 设计方法是:

为了认第一个球和第二个球尝试次数尽可能均衡,做运算,100的平方根是10。

我们次数 每 10 层扔一个玻璃球[10,20,...,90,100],

第 9 个时,次数是 1(第10层) + 9(第9个)  = 18

最坏的次数是 10(第100层) + 9(第99个) = 19

想想,还可以减少嘛~ 进Google可不容易哦

可以指出,这里的起始层可以是 第15层,依然每10层叠[15,25,...,85,95],

第14个时,次数是 1(第15层) + 14(第14个)  = 14

最坏的次数是 9(第100层) + 9(第99个) = 18


想想,还可以减少嘛~ 进Google可不容易哦

     为了设计更好的 粗调 和 精调 算法, 我们可以反过来想。

     假设最优尝试次数是 n 次,那么我们就从 n 层开始扔。

     if ( 第一个鸡蛋碎了 ){   // 尝试次数为 n , 第 n 层扔

     第二个鸡蛋从第1层开始,一层一层尝试,至 n - 1 层。( n - 1 ) + 1 = n, 满足最优次数

     }else{         // 尝试次数为 n - 1 ,第 n + (n - 1) 层扔

    楼层变成 100 - n 层 ,  因为总·尝试次数 = n - 1 ,所以扔的绝对楼层是 n + ( n - 1 ) 层 

    同理得,如果接着扔玻璃球没碎,总·尝试次数 = n - 2 , n - 3 , ... ;

   

   列出方程: x + (x-1) + (x-2) + ... + 1 = 100

           方程左边  x + (x-1) + ... + 1 尝试 x 次即为 x 项,右边 100 即总的楼层数。

          这是一个等差数列,可以转化为 (x + 1) * x / 2 = 100

      下面给出证明过程:

         Sn = a1 + a2 + a3 + ... + an   ①

      依据此式 ① , 可分成俩个方程

        Sn = a1 + (a2+d) + (a3+2d) + ... + an+(n-1)d

        Sn = an + (an-d) + (an-2d) + ... + an-(n-1)d

      相加解得: Sn = x·(a1+an) / 2 等同 (x + 1) * x / 2 = 100, 公差d = 1, a1 = x, an = 1, Sn = 100;

      (x + 1) * x / 2 = 100 解得 x = 14; ( x 向上取整 )

所以,最优解的最坏情况的尝试次数是 14 次,第一次扔玻璃球的楼层也是 14 层。

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

okok,  举个例子~

   假设玻璃球不会碎的临界点是 98 层,于是扔玻璃球的过程: 

  1:  14

  2:  27

  3:  39

  4:  50

  5:  60

  6:  69

  7:  77

  8:  84

  9:90

  a:  95

  b:  96

  c:  97

  d:  98

一共 14 次,等于 假设的最优解的最坏次数,测试多次后,发现恒成立。

想想,还可以减少嘛~ 进Google可不容易哦。

想一想,给你三个玻璃球,你咋分???

利用好 粗调 和 精调 的工程思维。

扔玻璃球 [ Google面试题 ]相关推荐

  1. Google面试题之100层仍两个棋子

    一道Google面试题,题目如下:"有一个100层高的大厦,你手中有两个相同的玻璃围棋子.从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个临界层 ...

  2. Google 面试题和详解

    Google的面试题在刁钻古怪方面相当出名,甚至已经有些被神化的味道.这个话题已经探讨过很多次,而科技博客 BusinessInsider这两天先是贴出15道Google面试题并一一给出了答案,其中不 ...

  3. 【Google面试题】有四个线程1、2、3、4同步写入数据…C++11实现

    Google面试题 有四个线程1.2.3.4.线程1的功能就是输出1,线程2的功能就是输出2,以此类推-现在有四个文件ABCD.初始都为空.现要让四个文件呈如下格式: A:1 2 3 4 1 2- B ...

  4. Google面试题:找几百亿数据的中值

    Google面试题:找几百亿数据的中值 http://blog.csdn.net/jiyanfeng1/article/details/8088237 有几百亿的整数,分布的存储到几百台通过网络连接的 ...

  5. google面试题,生男生女比例?

    Google面试题: 在一个重男轻女的国家里,每个家庭都想生男孩,如果他们生的孩子是女孩,就再生一个,直到生下的是男孩为止,这样的国家,男女比例会是多少? 答案:1:1 分析:  出生男女概率是50% ...

  6. 经典面试题扔鸡蛋(Google面试题附带LeetCode例题)

    该题由于太过于经典,现在已经不是Google的面试题了 思路讲解 大家可能存在的疑问解答 例题:LeetCode 887 鸡蛋掉落 PS:(蓝桥杯摔手机就是根据扔鸡蛋过来的) 思路讲解 你有两个鸡蛋, ...

  7. Google面试题:扔玻璃珠Matlab实现

    题目: 某幢大楼有100层.你手里有两颗一模一样的玻璃珠.当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎.这幢大楼有个临界楼层.低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于 ...

  8. 【奇葩面试题】因为太难而被禁用的17道Google面试题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mcfnhm/article/details/80923586 即使是最成功的公司,它的招聘过程有时也 ...

  9. 两个鸡蛋--一道Google面试题

    前两天翻译Python文档翻译到手软.今天不想翻译了,上网闲逛,在http://programming.reddit.com/ 上看到一道有趣的题目,据说是清华东门某家公司的面试题.原文地址http: ...

最新文章

  1. Android Activity的onRestart()方法
  2. 在线转flv+flash在线录制视频
  3. 用随机森林分类器和GBDT进行特征筛选
  4. 杀手级AI补代码工具问世,支持23种语言及5种主流编辑器,程序员沸腾了
  5. 讨论:如何降低Cocos2d开发的游戏包体大小
  6. ubuntu 配置dns访问外网
  7. scrollview背景
  8. 北斗导航 | Matlab实现GNSS接收机经纬度数据(NMEA语句)实时获取和地图绘制(Matlab源代码)
  9. android程序日历layout,Android使用GridLayout绘制自定义日历控件
  10. 计算机在能源领域的应用,计算机在能源中的应用
  11. Linux的起源与各发行版的基本知识
  12. O_RDWR, O_CREAT等open函数标志位在哪里定义?
  13. SVN或其他网盘类软件同步图标不显示的异常
  14. LeetCode 206 Reverse Linked List 解题报告
  15. python中面向对象的特殊成员_Python面向对象特殊成员
  16. 多线程下HttpContext.Current 的问题
  17. Tuxedo基本参数配置说明
  18. leetcode —— 207. 课程表
  19. 训练千亿参数模型的法宝,昇腾CANN异构计算架构来了~
  20. mysql函数做条件_MySQL语句优化(三):避免条件字段做函数操作

热门文章

  1. 使用 UML 服务组件表示 SOA 体系结构模式
  2. CentOS-7配置NFS服务及客户端挂载
  3. 扬帆策略|10万亿市场疯狂反攻,撑爆5万人,大牛市要来了?
  4. Android基础控件——TabLayout的使用、仿爱奇艺导航条
  5. 网上赚钱的方法有哪些?找到想干的项目,持之以恒
  6. oracle1791,安装11G,监听相关问题
  7. VI设计公司的意象思维
  8. 小菜鸟的SSM框架搭建【详细步骤】【SSM/IDEA/MAVEN】
  9. 数据中心建筑绿色评价系统简介
  10. 华为电视鸿蒙系统最新版本,华为解决互联网电视痛点:鸿蒙系统首发设备欲屏蔽开机广告...