丢鸡蛋 [Python3]

丢鸡蛋 [Python3]

'丢鸡蛋’是 LintCode(详见 LintCode 介绍)所提供的一道 简单 级别的面试题,现在我对Python3的实现做以简单分析,如有不妥之处,欢迎指正。

题目描述

楼有 n 层高,鸡蛋若从 k 层或以上扔,就会碎。从 k 层以下扔,就不会碎。
现在给两个鸡蛋,用最少的扔的次数找到 k。返回最坏情况下次数。

说明

这个题目真的不好搞懂。用最少的次数就是要用最好的判断方法,最坏的情况就是在你所想出最好的方法下最多所需要的判断次数,对于同一种方法而言,很明显楼层越高所需要的“实验”次数就越多,这个次数应该是和 n 有联系。同样我们不能忽略 k 的影响,k是决定最终最坏情况的值。

因为只有两个鸡蛋,所以第一个鸡蛋应该是按一定的间距扔,比如10楼,20楼,30楼等等,比如10楼和20楼没碎,30楼碎了,那么第二个鸡蛋就要做线性搜索,分别尝试21楼,22楼,23楼等等直到鸡蛋碎了,就能找到临界点。那么我们来看下列两种情况:

假如临界点是9楼,那么鸡蛋1在第一次扔10楼碎掉,然后鸡蛋2依次遍历1到9楼,则总共需要扔10次。

假如临界点是100楼,那么鸡蛋1需要扔10次,到100楼时碎掉,然后鸡蛋2依次遍历91楼到100楼,总共需要扔19次。

所以上述方法的最坏情况是19次,那么有没有更少的方法呢,上面那个方法每多扔一次鸡蛋1,鸡蛋2的线性搜索次数最多还是10次,那么最坏情况肯定会增加,所以我们需要让每多扔一次鸡蛋1,鸡蛋2的线性搜索最坏情况减少1,这样恩能够保持整体最坏情况的平衡,那么我们假设鸡蛋1第一次在第X层扔,然后向上X-1层扔一次,然后向上X-2层扔,以此类推直到100层,那么我们通过下面的公式求出X:

X + (X-1) + (X-2) + … + 1 = 100 -> X = 14

所以我们先到14楼,然后27楼,然后39楼,以此类推,最坏情况需要扔14次。

代码实现

通过刚才的分析,我们已经得到了计算最坏情况的公式:

x
Σ i = n ,求出X即为次数。
i=1

class Solution:
    
	def dropEggs(self, n):
        
	x = 0
        
	for i in range(n):
            
		x += i 
            
		if x >= n :
                
			return i 

这个代码已经相当简单,第一行是为了测试所需,不必多说。
第二行就是dropEggs函数,其参数 n 为楼层数(self 是定义类的方法所必需的,这里不多说了)。
接下来就是简单粗暴的运算过程:
定义一个总和 x 然后 从 1 开始不断加,一直加到这个 x >= n 为止:

为什么是大于等于 n 呢? 虽然我们在之前分析中写到 Σ i = n 这个式子,但这只是一个理想情况,也就是楼层数 n 刚好满足整数解的情况。但事实并非如此,比如100层楼要丢14次,那101层楼的话岂不是要丢14.2028293…次?当然,这是一个假想值,只是为了说明问题,所以我们应当在第一个满足 x >= n 的 i 值处就停止运算。

那么有的同学发现了,当 n 为 1 或 2 时该求和式不满足题目要求,所以这两种特殊情况要另外考虑。最终代码:

class Solution:

    def dropEggs(self, n):

        if n == 1 or n == 2:

            return n

        x = 0

        for i in range(n):

            x += i
 
           	if x >= n :

                	return i 

感谢浏览(点个赞再走呗)

你可能感兴趣的:(python,算法,面试)