两个鸡蛋--一道Google面试题
2006-12-07 22:11
459 查看
前两天翻译Python文档翻译到手软。今天不想翻译了,上网闲逛,在http://programming.reddit.com/ 上看到一道有趣的题目,据说是清华东门某家公司的面试题。原文地址http://classic-puzzles.blogspot.com/2006/12/google-interview-puzzle-2-egg-problem.html
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。
下面是偶的思路。
这是一个很典型的动态规划问题。用确定minNum
表示鸡蛋从高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代码如下:
偶的思路适合计算机蛮干。原作者的思路更简单。拿具体的数字作例子,假设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有钱也不能这样烧啊。打碎了搅拌均匀,加少许凉开水。一定要是凉开水,蒸了才不会有气泡,不然蒸出来和蜂窝似的,又难看又难吃。放到电饭锅蒸格上和米饭一起热。跳闸了再洒少许香葱末和香油,盖上盖子捂两分钟,美味的鸡蛋羹就出锅了。
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。
下面是偶的思路。
这是一个很典型的动态规划问题。用确定minNum
表示鸡蛋从高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代码如下:
偶的思路适合计算机蛮干。原作者的思路更简单。拿具体的数字作例子,假设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有钱也不能这样烧啊。打碎了搅拌均匀,加少许凉开水。一定要是凉开水,蒸了才不会有气泡,不然蒸出来和蜂窝似的,又难看又难吃。放到电饭锅蒸格上和米饭一起热。跳闸了再洒少许香葱末和香油,盖上盖子捂两分钟,美味的鸡蛋羹就出锅了。
相关文章推荐
- Google的一道面试题的推广(扔鸡蛋不破的层数,2个,3个,n个鸡蛋呢)
- 一道面试题 设计4个线程,其中两个每次对j增加1,另外两个对j每次减少1。循环100次。
- 【白话经典算法系列之十】 一道有趣的GOOGLE面试题
- Google面试题-高楼扔鸡蛋问题
- 一道面试题:怎么比较两个集合是否相等?
- Google 面试题 - 两个字符串的匹配问题(转)
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- 一道面试题:140个google面试题
- 一道Google面试题引发的代码优化战
- 一道面试题,完成两个36进制数的加法运算,36个字母从0开始到9,接着从A开始到Z结束,最大值Z,最小值0
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- 一道面试题:两个Fragment在replace/add 和 hide/show不同情况下来回跳转生命周期的变化
- 求子数组的最大和问题--一道浙江大学考研压轴题(被Google拿来做面试题)
- 白话经典算法系列之十 一道有趣的GOOGLE面试题
- 一道不简单又简单的Google面试题
- 记一道面试题:STL两个栈实现一个队列。
- 一道google面试题--自然数e中出现的连续的第一个10个数字组成的质数
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)