一道腾讯面试题:厉害了我的杯

【面经】20200711-腾讯pcg腾讯看点大数据后台开发 昨天,面试了腾讯pcg腾讯看点部门的后台开发岗位,偏大数据方向。 我本人其实是没有大数据相关工作经验的,但对于后台开发,经历了前2次的失败总结之后,我个人还是比较有信心的。如果对我的前两次的面试经验感兴趣,可以移步我之前的2片文章查看: 【面试题解析】快手基础架构中心高级C++开发 【面经】20200621-头条后台开发 面试官是一个年长我一些的人,看上去就很厉害。。。但整个过程下来,我觉得人还是蛮好的。 上来先让我做一下自我介绍,我简单介绍了一下背景,然后说了一下我工作前两年是... 阅读详情

题目描述

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

题目解析

举个?:  
如果从 x 楼扔下,没碎,在 x+1 楼扔下,碎掉了,即证明找到了 x+1 是刚好碎掉的楼层。

那么问题来了:怎样才能最快速的找到这个楼层?

问题的解决有很多种方案,注意点就是找到的最佳方案是能在各种情况下都能快速地找到目标楼层。

总结一下:我们的终极目的是要找出连续的两层楼 x 与 x + 1 ,在楼层 x 杯子没有摔碎,在楼层 x + 1 杯子碎了,问题的关键之处在于,测试之前,并不知道杯子会在哪一层摔碎,需要找到的是一种测试方案,这种测试方案,无论杯子会在哪层被摔碎,都至多只需要 m 次测试,在所有这些测试方案中, m 的值最小。

弄清题意后下面进行分析,事实上,学习过算法或者程序的人很容易想到这是一个搜索问题,那么完全可以使用二分法。

方案一:二分法

从 50 楼扔下,没碎的话,再扔 75 楼,再没碎我扔 88 楼,依次下去貌似很快就可以锁定楼层。

不过,很不巧,第一次从 50 层楼扔下去就碎了,这个时候就只能从 1 层开始慢慢的的一层一层地扔,如果杯子的质量是刚好在 49 层碎掉的话,那么最差的情况是需要扔 50 次。

640?wx_fmt=gif

方案二:分段查找区间法

核心点:先分区间的扔,再慢慢地一层一层地扔。

举个?:先从第 10 楼扔,再从第 20 楼扔,依次下去,如果到某一层碎掉,比如 60 层碎掉了,我再从 51 楼开始扔,这样比前面的二分法更快,因为即使又很不巧,杯子的质量比较好,在 99 楼才会刚好碎掉。这样的话,在这种最差的情况下,也只需要扔 19 次就能找到目标楼层。

640?wx_fmt=gif

方案三:基于数学方程的方法

事实上,这算是一道趣味问题,可以从数学的角度进行分析。

假设最少尝试次数为 x ,那么,第一个杯子必须要从第 x 层扔下,因为:如果碎了,前面还有 x - 1 层楼可以尝试,如果没碎,后面还有 x-1 次机会。

那么经过 x 次的尝试可以确定最高的楼层为 x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 。

那反过来,当最高楼层是100层,最少需要多少次呢?即 x(x+1)/2 >= 100, 得到 x >= 14 ,最少要尝试 14 次。

方案四:动态规划

先思考上面的 分段查找区间法 ,如果杯子的质量没那么好,在第 19 层就碎了,那么需要扔 11 次,这样比 99 楼刚好碎的情况要少很多次。

那么问题来了:能否无论杯子的质量如何,不管是很好还是很差,都可以快速地找到。

能!

上面的分析都是从杯子的角度出发的,这样想要得到最少的尝试次数,似乎比较难。我们可以换个角度,从每个高度的楼层来看:如果,某个楼层是可以安全落下的,那么最少需要多少次尝试呢?

事实上,这就是一个求最优解的问题了。

而我们编程解决问题的过程中,如果遇到最优问题的时候,往往可以先尝试一下动态规划的方法。

动态规划的一个出发点就是去 找到构成这个最优问题的最优子问题。

我们可以将这样的问题简记为 W(n,k) ,其中 n 代表可用于测试的杯子数,k 代表被测试的楼层数。对于问题 W(2,10), 我们可以如此考虑

解决这两个问题,可以分别得到一个尝试次数 p 与 q,我们取这两个次数中的较大者(假设是 p ),将 p 与第 1 次在 i 层执行测试的这一次相加,则 p+1 就是第一次将杯子扔在 i 层来解决 W(2,100) 所需的最少测试次数,将其表示为ti。

对于这 100 层楼的问题,第一次,我们可以把杯子扔在 100 层中的任何一层,所以可以得到 100 中解决方案的测试次数 T{t1,t2,t3,……,t100} ,在这些结果中,我们选取最小的 ti,使得对于集合 T 中任意的值 tj(1 <= j <= 100,j != i),都有ti <= tj,则 ti 就是这个问题的答案。

用公式来描述就是:

W(n, k) = 1 + min{max(W(n -1, x -1), W(n, k - x))}, x in {2, 3, ……,k}min{max(W(n -1, x -1), W(n, k - x))}, x in {2, 3, ……,k}

其中x是第一次的测试的楼层位置

其中W(1,k) = k(相当于 1 个杯子测试 k 层楼问题),W(0,k) = 0,W(n, 0) = 0

所以在计算 W(2,100) 之前,我们需先计算出所有 W(1,0) ,……, W(1,100) , W(2,0),……,W(2,99)这些的值。

使用递推的方法实现,代码如下:

 unsigned int DroppingCups(unsigned int cups, unsigned int floors){  unsigned int i, j, k, t, max;  unsigned int temp[cups + 1][floors + 1];         for(i = 0; i < floors + 1; ++i){         temp[0][i] = 0;         temp[1][i] = i;        }        for(i = 2; i < cups + 1; ++i){            temp[i][0] = 0;            temp[i][1] = 1;        }        for(i = 2; i < cups + 1; ++i){           for(j = 2; j < floors + 1; ++j){               for(k = 1, max = UINT_MAX; k < j; ++k){                   t = temp[i][j - k] > temp[i - 1][k -1] ?  temp[i][j - k] : temp[i - 1][k -1];                   if(max > t){                       max = t;                   }                }               temp[i][j] = max + 1;             }        }        return temp[cups][floors];  }

unsigned int i, j, k, t, max;

unsigned int temp[cups + 1][floors + 1];

       for(i = 0; i < floors + 1; ++i){
        temp[0][i] = 0;
        temp[1][i] = i;
        }

        for(i = 2; i < cups + 1; ++i){
           temp[i][0] = 0;
            temp[i][1] = 1;
       }

       for(i = 2; i < cups + 1; ++i){
          for(j = 2; j < floors + 1; ++j){
              for(k = 1, max = UINT_MAX; k < j; ++k){

                  t = temp[i][j - k] >
 temp[i - 1][k -1] ?  temp[i][j - k] : temp[i - 1][k -1];

                  if(max > t){
                      max = t;
                  }
               }

              temp[i][j] = max + 1;
            }
       }

       return temp[cups][floors];
 }

未完待续

这个问题实际上能延伸下去进行研究,比如进阶版:假设 f{n,m} 表示n层楼、m个杯子时找到最高楼层的最少尝试次数。还有上面代码时间复杂度和空间复杂度的也能进一步优化,大家有空可以想想!


软件测试+python测试开发面试题 软件测试+python测试开发面试题,测试开发面试题。 立即下载

相关推荐

SAP 物料账前期没有运行的解决方法

If you use the actual costing (material ledger), you must have completely closed all period-end closing operations in the actual costing for the penultimate period prior to the period shift. Use the '...

含笑饮砒霜死后更嚣张 3318

Python测试开发笔/面试题(含答案)

1.下列哪个语句在Python中是非法的?

软件自动化测试技术交流、资源分享 4530

使用kali对局域网内的主机进行远程控制

输入命令:hydra -l administrator -P/usr/share/woerdlists/rockyou.txt 192.168.100.241 smb -V。账户(adminitrator)密码:123456 【一般账户都是我们知晓了,如果不知道账户进行破解那几乎不太可能,密码如果设置的特别复杂无规律也是特别难破解的】【-r:扫描整个网段 后面就是设置 192.168.241.100/24的网络地址段 为 192.168.241.0/24 0和/24之间不要空格】

2301_77599769的博客 2281

腾讯面试题:杯子质量(最优查找)

问:有一种玻璃杯质量确定但未知,需要检测。有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎。现给你两个杯子,问怎样检测出这个杯子的质量,即找到在哪一层楼刚好会碎?------- 一条分割线的时间思考 ---------分析:首先理解题意,将这个杯子从某一层楼扔下,如果没碎,我还可以再利用它测试。如果碎了的话,就不能再继续用了。如果我从x楼扔下,没碎,在x+1楼扔下,碎掉了,即证明...

602

告别手动核对!用这个ABAP报表一键导出所有物料的库存与需求清单

本文介绍了如何通过定制化ABAP报表一键导出SAP系统中所有物料的库存与需求清单,整合MD04、MB52、ME2N等多个事务码的数据,大幅提升供应链管理和生产计划效率。该报表可自动生成包含库存状态、MRP需求、采购订单等关键指标的物料全景视图,帮助企业减少手工操作错误,节省时间成本。

weixin_33725515的博客 467

Abaqus子程序开发避坑指南:从UMESHMOTION到齿轮磨损分析实战

本文深入探讨Abaqus子程序开发中的关键技术与避坑指南,重点解析UMESHMOTION在齿轮磨损分析中的实战应用。从开发环境搭建、调试框架构建到性能优化和大规模计算,提供系统化的解决方案。通过真实案例展示如何避免内存泄漏、网格畸变等常见问题,并介绍数据驱动的磨损预测等前沿技术,帮助工程师提升仿真精度与效率。

weixin_30892037的博客 90

python测试开发面试题

Python的元类(Metaclass)是一种特殊的类,用来创建其他类。当我们创建一个新类时,实际上是调用了一个元类的方法。元类主要有两种用途:控制类的创建行为:例如,我们可以在元类中自定义类的名字、属性、方法等,从而控制类的行为。创建特殊类型的类:例如,我们可以利用元类来创建抽象基类、单例类等特殊的类。在Python中,所有的类都是由内置元类type创建的。当我们定义一个类时,如果没有指定元类,那么这个类的元类就是type。如果我们想改变类的行为,可以通过自定义元类来实现。

2401_86343726的博客 3589

StarWind V2V Converter v9 虚拟磁盘转换工具使用教程 (转)

StarWind V2V Converter v9.0.1.268 是一款免费的虚拟磁盘转换工具,支持不同管理程序间的虚拟机镜像格式转换,包括VMDK、VHD/VHDX、IMG和QCOW2等格式。该工具具有窗口修复模式、零拷贝转换和管理程序切换等特色功能,能够轻松实现物理机到虚拟机的转换,并兼容主流管理程序如Hyper-V、ESXi等。使用教程详细介绍了从本地文件选择到格式转换的完整操作流程,转换过程简单高效且不影响原虚拟磁盘数据。

hsh的专栏 1483

30道python自动化测试面试题

30道python自动化测试面试题,让你的面试过程比德芙还丝滑~

m0_37794269的博客 1万+

pandas,构造MultiIndex的四种方法:from_tuples、from_arrays、from_product、from_frame

1、from_tuples:通过 “元组对” 构造MultiIndex """ 一对元组,为一个索引 """ tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) 2、from_arrays:通过 “列表元素的组合” 构造MultiIndex """ 列中表的元素,按位置 对应组合,形成索引 """ arrays

jieru_liu的博客 5389

第五章 TTM 后备管理:5.6系统内存域

系统内存域由 TTM 内置资源管理器管理,通过 ttm_tt 承载页信息,依赖 ttm_pool 提供物理页。ttm_tt 管理页数组、缓存属性与状态标志,支持外部页与换出机制。初始化分 ttm_tt_init 与 ttm_sg_tt_init,生命周期包括创建、填充、释放与销毁。页池针对 write-combined、uncached 及一致性 DMA 分配的页进行缓存,提升性能并减少 TLB 刷新。分配时高阶优先、批量设置缓存属性,回收时清零后归还池中,确保高效复用。

图形/计算GPU的驱动与虚拟化技术分享园地 2571

2023Python测试开发面试题

Python的元类(Metaclass)是一种特殊的类,用来创建其他类。当我们创建一个新类时,实际上是调用了一个元类的方法。元类主要有两种用途:控制类的创建行为:例如,我们可以在元类中自定义类的名字、属性、方法等,从而控制类的行为。创建特殊类型的类:例如,我们可以利用元类来创建抽象基类、单例类等特殊的类。在Python中,所有的类都是由内置元类type创建的。当我们定义一个类时,如果没有指定元类,那么这个类的元类就是type。如果我们想改变类的行为,可以通过自定义元类来实现。

m0_58026506的博客 197

从重复劳动到智能闭环:OpenClaw实战搭建小红书&公众号全自动化运营体系

如果你有一定的代码开发能力,还可以为OpenClaw开发自定义插件,拓展更多的功能,比如对接更多的平台,实现图文+短视频的全平台自动化运营;对接视频剪辑工具,实现短视频脚本生成、剪辑、配音、发布的全流程自动化;对接私域运营工具,实现公域引流、私域承接、用户转化的全链路自动化;对接电商平台,实现内容种草、商品上架、订单管理的全流程自动化,打造完整的内容电商闭环。新媒体运营的本质,是内容价值的传递,而不是机械的重复劳动。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 311

据说此题是入职腾讯游戏策划部门一道题

<br /><br />据说此题是入职腾讯游戏策划部门一道题<br />三个人,站成一个边长为2米的等边三角形正在进行死亡游戏,任何一个人必须杀死另外两人才能存活,三个人的体育运动能力基本相同,且皆为普通人(没有经过特殊训练的)。 <br /><br />一个人拿刀(香港古惑仔砍人的刀),一个人拿手-枪(只有一颗子弹),一个人拿着一个平底祸(正常大小,子弹无法穿透)。 <br /><br />游戏开始前各自的武器都放在各人身前的地面上。 <br /><br />请问如果你要加入游戏,你会选择什么样的武器。请

xiechao240的专栏 4505

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

一道腾讯面试题:厉害了我的杯-腾讯云开发者社区-腾讯云

xiaocong1990的博客 156

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

互联网公司最常见的面试算法题有哪些?

很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么? 你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂。 你在面试的时候,卡壳了,一时间忘了怎么写代码了 ...

程序员吴师兄的博客 1156

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

小学弟厉害了

大家好,我是菜刀最近有一位小学弟成功去了腾讯,找他要了一些面试相关的资料,内容涵盖计算机基础、Java、分布式、大厂面经,质量非常高!!!不要再看那些到处拼凑出来的面试题了!不管大家最近要...

slphahaha的博客 112

米哈游排名首超腾讯,登顶榜首 !!!

现在是三月份,正是金三银四跳槽的好机会,銘哥给大家准备了面试最常见的 210 道面试题 和 100 套简历模板,需要的小伙伴可以关注公众号:銘聊技术, 回复210获取面试题,回复100获取简历模板。

weixin_42104279的博客 994

腾讯2015年秋招一面

这是我写的第一篇博客,请大家多多支持哈。 这里就来说说我今天的面试吧。今天我参加了腾讯2015秋招的一面,地点是广州,职位是移动开发工程师。废话不多说,直接说我的面试过程。 1、首先进到房间,面试官让我做自我介绍。由于准备得还不错,就抑扬顿挫地介绍了自己。 2、接着问了一道常见的面试题:给n个数排序,要求时间复杂度为O(n)。这道题前几天刚看过,然后我思考了几十秒来组织思路,说完之后

粥 1520

腾讯社招iOS面试记录

点击上方“iOS开发”,选择“置顶公众号” 关键时刻,第一时间送达!       先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。       “这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜...

iOS_开发 6039

腾讯3轮面试都问了Android事件分发,灵魂拷问

开头 大家都知道,找工作的时候高薪不好拿,一般人能拿 30k 的 offer 就不错了。据我所知百分之九十的Android开发都在30k以下! 但是在我的群里有一位同学,平时就喜欢研究源码和框架,然后经过一个月的刷题,跳槽到头条,拿到了 50k 的月薪,我觉得太厉害了,羡慕嫉妒恨啊。 后来我和他聊了下,发现他技术确实好,在刷题期间,除了算法,他还把自己的 Android 笔记拿了出来,里面都是他平时的积累,内容全面,深度也有,有插件化、依赖注入,还有各种架构知识。 果然,只要技术好,走到哪里都不怕啊。大家在

m0_57205294的博客 136

腾讯社招ios面试

点击上方“iOS开发”,选择“置顶公众号” 关键时刻,第一时间送达! &nbsp; &nbsp; &nbsp; 先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一...

judgejames的博客 1485

腾讯2016实习生招聘后台研发面试经

4月12号收到的腾讯一面短信,4月14号一面,4月15号收到二面短信,4月16号二面,遗憾止步二面。有太多东西需要总结,在此与大家分享经验。 一、笔试 一般没有内推或内推面试失败可以参加统一笔试,这里说一下,内推其实很有用的,即使是参加统一招聘,如果曾经内推面试过,都是有记录的,甚至有可能面试官通过内推人对面试人提前都有了解,对面试很有帮助(身边就有这样的情况,二面就随便拉了拉家常就过了…

Leeon的博客 1873

2020大数据开发实习面经(阿里 360 腾讯 字节)

我是末流985本科大三生,找一个大数据方向的实习。因为没有课了,所以可以实习六个月左右。 阿里 时间: 2020年3月26日 一面 阿里一面的时候,刚刚开始复习。Python Java等等都还没看。只看了下大数据相关的知识。凉的明明白白。 写一道算法题,旋转数组求最小值(剑指offer面试题11)。当时只记得是二分查找,没写出来。 问下Java GC (不会) 问下Python GIL(不会) 非常感谢这位老师,面试之后就不再觉得自己很厉害了。我知道自己还有太多要复习的了。自己还是把面试想得太简单,周围

zydxn1350的博客 1507
上一篇: 中国互联网公司亏损能力排行榜
下一篇: 微软再称王
菜鸟学Python
博客等级 码龄9年 8082粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值