【限时收费】年底最强一次云计算大会,看传统、社区、互联网企业如何碰撞?
关于编程任务有很多很不错的面试谜题。新年之际,我把压箱底儿的一道好题,同时也是传说中谷歌招聘官最喜欢问的一道题找出来了!
明天我们来好好八一八这道题,假设你往年恰恰想去谷歌面试,可以抓紧多读几遍!(相对不会出现下图的状况,我们只放有口碑的神助攻
标题如下:
你在一座100层的高楼大厦里任务,拿到了两个如出一辙的鸡蛋。你得搞明白鸡蛋最高可以从几层楼扔出去还不摔坏。
请提出一个算法,能找到投掷鸡蛋却保证不摔坏的最少次数~
我们可以先做些假定:
假设鸡蛋从某一楼层跌落而不摔坏,那么当它从更低楼层跌落也不会有破损。
一个在被投掷之后残缺无损的蛋可以被再应用。
一颗鸡蛋假设破损,则必会被丢弃。
跌落关于一切鸡蛋都具有同等效应。
假设一颗鸡蛋从某一楼层跌落之后受损,那么当它从更高楼层跌落后必定会摔坏。
假设一颗鸡蛋从一次跌落中存活上去,那么它一定会从更短程的下降中存活。
大少数人会写出算法来处置这个谜题(我们异样也是会用算法),但是实践上有更容易的办法。
敲黑板说重点啦!
最复杂的回答
最复杂的方式来获取最少楼层数就是将鸡蛋从第一层扔出,然后第二层,然后依次往后叠加。这样一来,当鸡蛋破碎那一刻我们就知道是这一层了。这是一个牢靠的算法,但是在最差的状况下它需求的投掷次数是100次。
需求留意的最重要的一点是,假设你只要一颗鸡蛋,这是独一牢靠的办法。所以在你打破第一颗鸡蛋时就需求末尾运用这个算法。
直觉性的答案
这样,我们应该把这100层划分红更小数目的的区间,以尽能够有效地运用这第一颗鸡蛋。因此,一个凭直觉的而且颇受欢迎的办法是从1/第n层逐层反省。
比方说,从第一层到第三层。由此得出算法如下:
从33楼投掷出这颗鸡蛋。假设它破损了,那么我们用第二颗鸡蛋反省第32层楼。
否则,我们从33+ (67 *1/3) =55层楼扔,假设鸡蛋破损,我们再来用第二颗鸡蛋反省34层到55层。
…
关于1/3最坏的状况是最大值是33层,这样一来,我们能够可以找到一个完美的n,借助一些静态编程手腕,来优化投掷次数。这是一个表现编程思想的有价值的处置方式,但是这不是最优解。
完美处置方案
为了了解完美解法,我们需求了解平衡形状,用于计算出在最坏情境下所需的投掷次数。
这里,F(n) 是我们从末尾投掷鸡蛋计算的下一层楼层。
假设我们引入以下的变量:
那么平衡点将会是如下:
最优解是当这个方程里的一切参数都相等。我们是如何取得的呢?从末尾末尾看,最后的D(n)将会变成1,由于我们最终将会抵达一个点,就是只要单一的一层楼用于投掷第一颗鸡蛋。所以D(n-1)应该等于2,由于它相比于第一颗鸡蛋少了一次投掷。
我们接着会发现第一颗鸡蛋最终应该是从第99层楼投掷,之前是从99-2=97层,再往前则是97-3=94层,90, 85, 79, 72, 64, 55, 45, 34, 22,然后是第九层。这是一个最优解!这样一来,我们需求在最坏的状况下投掷14次(最小的差别在于13,但是我们还需求在第九层额外投一次)。
反省
好啦,我们曾经有了处置方案,可以无需任何其他协助来解开它。如今是时分验证它能否正确了!为此,我们可以写一个Kotlin方程式。
首先,我们来解释一下对一些决策来说,是如何计算投掷次数的。当我们有2层或许更少的层数,那么我们需求按照剩余的楼层数来投掷尽量多的次数。否则我们应该调用如下方出现的平衡函数:
这里我们调用了bestMaxThrows 函数,这是一个假定函数,它会前往一个投掷次数的数值,假定接上去的一系列决策是完美的。
我们是这样定义它的:
再一次的,我们刚刚授权给了bestNextStep 函数来计算“下一层的最优解”。这个函数很好的为我们指明了下一步的方向,我们可以复杂地定义它:当只要二层或更少的楼层待检验,那我们会从第一层扔出鸡蛋,否则我们需求反省一切备选项以找到最优解。
下面是详细执行步骤:
(责任编辑:admin)