经典谷歌面试题:高楼扔鸡蛋

2023-12-14 19:58

本文主要是介绍经典谷歌面试题:高楼扔鸡蛋,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

经典谷歌面试题:高楼扔鸡蛋

存在某T层高楼,在该高楼中存在这样的一层,在该层之下的所有楼层扔鸡蛋,鸡蛋摔到地上都不会碎,还可以继续扔;在该层及该层之上的所有楼层,扔下鸡蛋都会摔碎。
目前手里有两个鸡蛋,怎样扔才能在最坏情况下,使得扔的次数最小。

Java代码如下,更改楼层层高T,可输入扔鸡蛋的最小次数。

package code.improved;
public class ThrowEggs {//谷歌高楼扔鸡蛋问题//从T层高楼扔下鸡蛋,用何种方式使得在最坏情况下,使尝试的次数最少public static void main(String[] args) {int T=39;int[] mall=new int[T+1];//初始化一个数组,用于存储递归过程中的中间数据System.out.println(f(T,mall));   }//递归算法static int f(int n,int[] mall){if(n<0) System.out.println("error");if(n==0) return mall[0]=0;if(mall[n]!=0) return mall[n];int fn_1=f(n-1,mall);//递归函数的结果赋值给局部变量,让递归函数只执行一遍。//将f(n-i)的第一个结果f(n-1)的结果赋值给minResult,以方便后面循环中的比较。int result=0,minResult=0>=fn_1?1:fn_1+1;//遍历不同的i,找到最小的f(n)作为返回for (int i = 2; i <= n; i++) {int fn_i=f(n-i,mall);result=i-1>=fn_i?i:fn_i+1;minResult=result<minResult?result:minResult;}   return mall[n]=minResult;}
}

改进版,可以输入扔鸡蛋的策略

package code.improved;
public class ThrowEggsStrategy {//“改进版”谷歌高楼扔鸡蛋问题,能够输出扔鸡蛋的楼层//从T层高楼扔下鸡蛋,用何种方式使得在最坏情况下,使尝试的次数最少public static void main(String[] args) {int T=100;int[] mall=new int[T+1];//初始化一个数组,用于存储递归过程中的中间数据//用来存储扔鸡蛋的楼层信息,如100层的高楼,第一个扔的鸡蛋是在14层,则throwEggs[100]=14;int[] throwEggs=new int[T+1];System.out.println("在最坏情况下,至少要扔鸡蛋的次数为:"+f(T,mall,throwEggs));   //输入扔鸡蛋的策略int floor=0;for (int i = throwEggs.length-1; i >=1; i=i-throwEggs[i]) {floor+=throwEggs[i];System.out.println("对于高度为"+T+"的楼层,应该在"+floor+"层扔鸡蛋");}}//递归算法static int f(int n,int[] mall,int[] throwEggs){if(n<0) System.out.println("error");if(n==0) return mall[0]=0;if(mall[n]!=0) return mall[n];int fn_1=f(n-1,mall,throwEggs);//递归函数的结果赋值给局部变量,让递归函数只执行一遍。//将f(n-i)的第一个结果f(n-1)的结果赋值给minResult,以方便后面循环中的比较。int result=0,minResult=0>=fn_1?1:fn_1+1;//遍历不同的i,找到最小的f(n)作为返回for (int i = 2; i <= n; i++) {int fn_i=f(n-i,mall,throwEggs);result=i-1>=fn_i?i:fn_i+1;minResult=result<minResult?result:minResult;}    //已获得minResult,再找一遍,输出是在哪个i获得的minResult//该循环中,对于i使用逆序的原因是,尽量从较高的楼层扔鸡蛋,使得满足条件的扔鸡蛋的楼层更高,跨度更大一些。for (int i = n; i >= 1; i--) {int fn_i=f(n-i,mall,throwEggs);result=i-1>=fn_i?i:fn_i+1;if(minResult==result){//System.out.println("对于高度为"+n+"层的高楼,在第"+i+"层扔出鸡蛋。");throwEggs[n]=i;//对于某个n层高楼,可能存在多个楼层扔出鸡蛋,使得扔鸡蛋的次数最小。//即,存在多个i可以使得minResult最小。因此只需要一个值即可,故用break跳出循环。   break;}; }return mall[n]=minResult;}
}

这篇关于经典谷歌面试题:高楼扔鸡蛋的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493758

相关文章

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`

Laravel 面试题

PHP模块 PHP7 和 PHP5 的区别,具体多了哪些新特性? 性能提升了两倍 结合比较运算符 (<=>) 标量类型声明 返回类型声明 try…catch 增加多条件判断,更多 Error 错误可以进行异常处理 匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义 …… 了解更多查看文章底部链接 PHP7 新特性 为什么 PHP

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。