您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    妙解谷歌压箱底面试题:如何正确的从楼上抛鸡蛋
    时间:2018-01-03 08:50 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    【限时收费】年底最强一次云计算大会,看传统、社区、互联网企业如何碰撞?

    关于编程任务有很多很不错的面试谜题。新年之际,我把压箱底儿的一道好题,同时也是传说中谷歌招聘官最喜欢问的一道题找出来了!

    妙解谷歌压箱底面试题:如何正确的从楼上抛鸡蛋

    明天我们来好好八一八这道题,假设你往年恰恰想去谷歌面试,可以抓紧多读几遍!(相对不会出现下图的状况,我们只放有口碑的神助攻

    妙解谷歌压箱底面试题:如何正确的从楼上抛鸡蛋

    标题如下:

    你在一座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)