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

原创 2006年12月07日 22:11:00

前两天翻译Python文档翻译到手软。今天不想翻译了,上网闲逛,在http://programming.reddit.com/ 上看到一道有趣的题目,据说是清华东门某家公司的面试题。原文地址http://classic-puzzles.blogspot.com/2006/12/google-interview-puzzle-2-egg-problem.html

两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。

下面是偶的思路。

这是一个很典型的动态规划问题。用确定minNum[n]表示鸡蛋从高n层的楼摔下不碎需要的最小次数。则有

转移方程:

minNum[n ] = min(1 + max(i – 1, minNum[n-1])) for 1<=i <= n

边界条件:

minNum[0] = 0; minNum[1] = 1

假设i是第一次扔鸡蛋的楼层,如果破了,则为了确定下面楼层中的安全位置,需要从第一层挨着试,需要i-1次,不碎的话上面还有n-i层,还剩两个鸡蛋,需要minNum[n-i]次。

Python代码如下:

#The Standard Problem in simple writing goes like this:
#
#
#* You are given 2 eggs.
#* You have access to a 100-storey building.
#* Eggs can be very hard or very fragile means it may break if dropped from the first floor or may not even break if dropped from 100 th floor.Both eggs are identical.
#* You need to figure out the highest floor of a 100-storey building an egg can be dropped without breaking.
#* Now the question is how many drops you need to make. You are allowed to break 2 eggs in the process
 
N = 100
# the element of result is a tuple
# first elem of the tuple is the mininum number needed
# second elem of the tuple is the firs position to throw the egg
results = [(0, 0), (1, 1)]
for i in range(2, N+1):
    minNum, minPos = N + 1, -1
    for j in range(1, i + 1):
        temp = 1 + max(j - 1, results[i - j][0])
        if temp < minNum:
            minNum, minPos = temp, j
    results.append((minNum, minPos))
for result in results:
    print result

偶的思路适合计算机蛮干。原作者的思路更简单。拿具体的数字作例子,假设100层楼扔16次可以搞定,那么第一次可以且最矮必须从16层扔。碎了好说,从第一层开始试,不碎的话还有15次机会,同理最矮可以从31层开始扔

每次可以扔的最矮楼层如下

16

16 + 15 = 31

31 + 14 = 45

45 + 13 = 58

58 + 12 = 70

70 + 11 = 81

81 + 10 = 91

91 + 9 = 100

超额完成目标。假设需要扔n次,则有

n + (n-1) + (n-2) + … + 1 >= 100

n (n +1) >= 200

min(n) = 14

好好的鸡蛋摔碎了多可惜,Google有钱也不能这样烧啊。打碎了搅拌均匀,加少许凉开水。一定要是凉开水,蒸了才不会有气泡,不然蒸出来和蜂窝似的,又难看又难吃。放到电饭锅蒸格上和米饭一起热。跳闸了再洒少许香葱末和香油,盖上盖子捂两分钟,美味的鸡蛋羹就出锅了。

 

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

经典谷歌面试题:高楼扔鸡蛋存在某T层高楼,在该高楼中存在这样的一层,在该层之下的所有楼层扔鸡蛋,鸡蛋摔到地上都不会碎,还可以继续扔;在该层及该层之上的所有楼层,扔下鸡蛋都会摔碎。 目前手里有两个鸡蛋...
  • siegecat
  • siegecat
  • 2016年09月12日 21:38
  • 367

Google的一道面试题的推广(扔鸡蛋不破的层数,2个,3个,n个鸡蛋呢)

Google的面试题在论坛炒得很火,今年题目如下:“有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个...
  • chhuach2005
  • chhuach2005
  • 2014年09月08日 15:07
  • 1832

Google面试题之经典鸡蛋问题

还是有些晕。。。 Q: 只给你二个鸡蛋,你能上100层楼,你想知道鸡蛋的硬度。鸡蛋可能很硬或很脆弱,如果鸡蛋从第m层掉下而没破裂,而从第m+1层掉下就破裂了,那么这个鸡蛋的硬度就是m。你需要找出这个m...
  • buaa_shang
  • buaa_shang
  • 2013年09月25日 10:39
  • 2353

Google的一道面试题的推广(扔鸡蛋不破的层数,2个,3个,n个鸡蛋呢)

Google的面试题在论坛炒得很火,今年题目如下:“有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个...
  • chhuach2005
  • chhuach2005
  • 2014年09月08日 15:07
  • 1832

一道有趣的面试题——扔鸡蛋问题

现在很多大型IT企业在面试时都喜欢问一些智力相关的题目,虽然智力面试题在面试笔试中占的比例不大,但很多时候,面试环节中智力题往往会成为我们拿offer的最大拦路虎。因为有些面试官认为通过智力题可以考查...
  • Devil_2009
  • Devil_2009
  • 2014年09月17日 11:21
  • 3098

N个鸡蛋从M楼层摔(2个鸡蛋从100层摔)

一、题目:   有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。二、思路:...
  • wolinxuebin
  • wolinxuebin
  • 2015年07月25日 16:36
  • 3640

Google面试题-高楼扔鸡蛋问题

Google面试题-高楼扔鸡蛋问题 简单详尽的理解思路
  • lonelyrains
  • lonelyrains
  • 2015年06月09日 18:06
  • 6025

Google面试题之经典鸡蛋问题

还是有些晕。。。 Q: 只给你二个鸡蛋,你能上100层楼,你想知道鸡蛋的硬度。鸡蛋可能很硬或很脆弱,如果鸡蛋从第m层掉下而没破裂,而从第m+1层掉下就破裂了,那么这个鸡蛋的硬度就是m。你需要找出这个m...
  • buaa_shang
  • buaa_shang
  • 2013年09月25日 10:39
  • 2353

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

转自   一道Google面试题,题目如下:“有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来...
  • wdjhzw
  • wdjhzw
  • 2014年06月30日 18:06
  • 2079

#google面试题14#找出两个排序数组的合并后的中位数

given sorted int[] A, int[] B. How would you find the maiden that would have been if both were combi...
  • overstack
  • overstack
  • 2013年03月07日 22:06
  • 648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两个鸡蛋--一道Google面试题
举报原因:
原因补充:

(最多只允许输入30个字)