【问题标题】:Mine n grams of mineral using robot - JPMC Interview question使用机器人开采 n 克矿物 - JPMC 面试问题
【发布时间】:2020-09-13 04:59:36
【问题描述】:

使用机器人开采 n 克矿物,该机器人可以通过每天开采 1gm 或每天创建另一个机器人来度过一天 - JPMC 面试问题

  • 新建机器人一天后才能开始工作。
  • 开采 n 克矿物需要多少天/多少个机器人?

例如:输入 1 输出 1 输入 4 输出 3

【问题讨论】:

  • 那你的答案是什么?

标签: algorithm data-structures puzzle


【解决方案1】:

机器人的最佳输出完全取决于它还有多少天可以工作。我们可以很容易地给出一个最优的递归:

def optimal_output(days):
    if days == 0: return 0
    if days == 1: return 1
    return max(optimal_output(days - 1) + 1,  # Mine.
               optimal_output(days - 1) + optimal_output(days - 2)) # Create robot.

我们可以看看前几个术语:

>>> [optimal_output(n) for n in range(10)]
[0, 1, 2, 3, 5, 8, 13, 21, 34, 55]

嘿,这只是斐波那契。这是有道理的,因为在第 3 天之后,optimal_output(days - 1) + 1 永远不会高于optimal_output(days - 1) + optimal_output(days - 2),我们只剩下斐波那契的重现。


以上假设第 1 天建成的机器人只能在第 3 天开始工作。如果它可以在第 2 天开始工作,我们有以下重复:

def optimal_output(days):
    if days == 0: return 0
    if days == 1: return 1
    return max(optimal_output(days - 1) + 1,  # Mine.
               optimal_output(days - 1) + optimal_output(days - 1)) # Create robot.

简化为f(1) =f(n) = 2f(n-1),或者换句话说,就是二的幂。

【讨论】:

    【解决方案2】:
    int findMinDaysUsingMath(int grain) {
        return (int) Math.ceil(Math.log(grain) / Math.log(2)) + 1;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2011-03-15
      • 1970-01-01
      • 2020-08-09
      • 2021-07-25
      相关资源
      最近更新 更多