博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道有趣的面试题
阅读量:6868 次
发布时间:2019-06-26

本文共 1121 字,大约阅读时间需要 3 分钟。

日前在网上看到一道面试题。颇有意思,也细细的研究一番。现将该题发布于此,和各位交流一下。

  某幢大楼有100层。你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式。

  例如:有这样一种方式,第一次选择在60层扔,若碎了,说明临界点在60层及以下楼层,这时只有一颗珠子,剩下的只能是从第一层,一层一层往上实验,最坏的情况,要实验59次,加上之前的第一次,一共60次。若没碎,则只要从61层往上试即可,最多只要试40次,加上之前一共需41次。两种情况取最多的那种。故这种方式最坏的情况要试60次。

  那该如何设计方式呢?

  仔细分析一下,关键是第一次的选择,假设在第N层,如果第一次扔的时候就碎了,那么第二颗珠子只能是从第1层开始一层层往上试,此时,最坏的情况为N-1次,加上第一次,则一共为N层。那如果不碎呢,第二颗珠子会从N+1层开始试吗?很显然不会,此时大楼还剩100-N层,问题就转化为100-N,2颗珠子,请设计最有效方式。

  哦,等等想到什么?呵呵,我想到递归

  定义一个函数F(N),表示N层楼最有效方式最坏情况的次数。

  通过上面的分析,有

  F(N)=Min(Max(1,1+F(N-1)),Max(2,1+F(N-2)),……,Max(N-1,1+F(1)))

  F(1)=1

  本面试题就是求F(100)

  下面把解法的代码赋予其后,用的是VB2005

  

 
1
Dim
F(
100
)
As
Integer
, i
As
Integer
, j
As
Integer
2
Dim
tC
As
Integer
3
F(
0
)
=
0
4
F(
1
)
=
1
5
6
For
i
=
2
To
100
7
F(i)
=
100
8
For
j
=
i
To
1
Step
-
1
9
tC
=
IIf(j
>
1
+
F(i
-
j), i,
1
+
F(i
-
j))
10
If
tC
<
F(i)
Then
F(i)
=
tC
11
Next
12
Next
13
14
For
i
=
1
To
100
15
16
Debug.Print(F(i))
17
Next
http://www.cnblogs.com/grenet/archive/2009/12/20/1628425.html
你可能感兴趣的文章
纠结的网络
查看>>
安装CactiEZ的anaconda报错
查看>>
Exchange 2010安装先决条件及注意事项
查看>>
Google Guava提供了Joiner类的初探
查看>>
搭建高可用mongodb集群(三)—— 深入副本集内部机制
查看>>
快递查询文档
查看>>
VIM常用替换,查找命令
查看>>
2010年3月计算机等级考试二级C笔试试题(文字版)
查看>>
Nginx+Tomcat动静分离架构
查看>>
我的友情链接
查看>>
Strategy Design Pattern(策略模式)
查看>>
龙年第一篇
查看>>
Linux 结构化命令(while/if/for)
查看>>
在Linux系统上获取命令的帮助信息,man文档的章节的划分
查看>>
scala ide
查看>>
mysql存储过程简单学习
查看>>
kvm安装
查看>>
对你同样重要的非技术贴,10件事证明你跟错了人
查看>>
CentOS 6.5安装JDK
查看>>
一个文件的某一列写入到另一个文件的行中shell与python
查看>>