一道有趣的面试题

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

  某幢大楼有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

 

时间: 2024-09-28 21:05:50

一道有趣的面试题的相关文章

经典算法(11) 一道有趣的GOOGLE面试题 --【解法2】

上一篇<白话经典算法系列之十一道有趣的GOOGLE面试题>中对一道有趣的GOOGLE面试题进行了详细的讲 解,使用了类似于基数排序的做法在O(N)的时间复杂度和O(1)的空间复杂度完成了题目的要求,文章发表后 ,网友fengchaokobe在评论中给出了另一种解法,见下图. 文字版: int Repeat(int *a, int n) { for(int i = 0; i < n; i++) { if(a[i] > 0) //判断条件 { if(a[ a[i] ] < 0)

经典算法(10) 一道有趣的GOOGLE面试题

最近在微博上看到一道有趣的GOOGLE面试题,见下图: 文字版: 一个 大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空 间和O(n)时间. 这个题目要求用O(n)的时间复杂度,这意味着只能遍历数组一次.同时还要寻找重复 元素,很容易想到建立哈希表来完成,遍历数组时将每个元素映射到哈希表中,如果哈希表中已经存在这个 元素则说明这就是个重复元素.因此直接使用C++ STL中的hash_set(参见<STL系列之六 set与hash_set

阿里巴巴一道智力题笔试题

问题描述 阿里巴巴一道智力题笔试题 有三张牌A,B,C,其中一张是King.如果你押中了King,那么就获胜,否则就输.现在你选择了押其中的一张牌1,电脑帮你排除了另外两张牌中的一张2,那么你是否重新选择押3,从而更容易获胜? http://www.manong1024.com/q/403 解决方案 google 三扇门问题真怀疑这是不是阿里的题,感觉很低级很low,像庙会灯谜上的题. 解决方案二: 假设挑选A其为king的概率p=1/3剩下的BC中为king的概率p=2/3.假设主持人又给你排

一道蛋疼的面试题

题目: 1 int n = 20; 2 for(int i = 0; i < n; i--){ 3     printf("*"); 4 } 只能增加或是修改其中的一个字符,让程序输出20个"*". 答案: 1 //第一种解法:在for循环中给 i 加一个负号 2 for(int i = 0; -i < n; i--) 3    4 //第二种解法:在for循环中把 i-- 变成 n-- 5 for(int i = 0; i < n; n--) 6

c str-c++中c_str()函数--一道简单的机试题

问题描述 c++中c_str()函数--一道简单的机试题 题目描述:输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串.输入:测试数据有多组,输入字符串.输出:对于每组输入输出处理后的结果.样例输入:bacd样例输出:abcd源代码: #include#include#include#include#includeusing namespace std; int main() { int i = 0jnum; string in; char* arr = new char

jquery js-今天做了一道神奇的笔试题

问题描述 今天做了一道神奇的笔试题 如何用一行jquer实现动画轮播 <div class="slide"> <img src="1.png"> <img src="2.png"> <img src="3.png"> <img src="4.png"> </div> 解决方案 也就是你运气好,让别的看见又得告诉你思路了 var spee

一道腾讯面试题的思考:到底谁会赢?

最近看到一道腾讯面试题,觉得很有意思.题干如下:        有甲乙两家伙用一个英语单词玩游戏(无聊的人还是很多的!!!).两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z,假设单词字母不区分大小写,也就是说,a与A算相等),则这个人胜利.假设两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么? 输入: 一连串英文小写字母,长度任意(当然要在计算机能承受的范围内),保证最开始

一道有趣的字符串笔试题 以及队列问题笔试题

问题描述 1. 请完成函数,该函数输入一个纯英文字符串,请打印出该字符串中每个字符(区分大小写)出现的次数,并按照出现的次数从大到小排列,如输入"asisaB",则打印出a=2,s=2,i=1,B=1. 注:要求不能使用如Map,List等集合类. 2.使用Java实现阻塞队列BlockQueue,请插入数据调用Offer,如果已满则等待.获取数据调用take,如果队列为空,则等待.请完成该类 请高人写出程序代码 加有些详细注解更佳 谢谢!!!!!!!!!!!!!!!!! 解决方案 第

一道阿里巴巴海量数据笔试题

问题描述 在看到的一道笔试题:搜索引擎的日志要记录所有查询串,有一千万条查询,不重复的不超过三百万.要统计最热门的10条查询串.内存<1G.字符串长0-255(1)主要解决思路(2)算法及其复杂度分析 解决方案 解决方案二:我能想到的就是哈希+堆排序了