【问题标题】:Why does this method fail?为什么这个方法会失败?
【发布时间】:2020-07-27 17:36:26
【问题描述】:

最近在一次采访中遇到了这个问题。给定一个整数数组,找到可以用作起点的最小整数 x,这样当您将数组中的每个数字添加到运行总数中时,运行总数永远不会低于 1。他们给我的函数存根,对于Java,接受了一个列表集合,我应该返回一个很长的。对我来说,这个解决方案似乎必须有效,但每个测试用例都失败了。为什么?

public static long minStart(List<Integer> arr) {
    long minStart = 0;
    long runningTotal = minStart;
    for(int i = 0; i<arr.size(); i++){
        runningTotal += arr.get(i);
        if(runningTotal<1){
            minStart++;
            i = 0;
            runningTotal = minStart;
        }
    }
    return minStart;
}

【问题讨论】:

  • 为什么要增加 minStart 变量?
  • 您假设最小起始 int 至少为零。会不会是负数?
  • 为什么不计算数组的总和并找出最小的总和。然后使您的起始 int 等于该最小值的负数。
  • 我增加 minStart 以便找到起点。起点,或 minStart,必须是一个正整数,并且必须是最小的,以确保 runningTotal 永远不会低于 1。我的想法是从低处开始并移动到更高处,这样第一个有效的值必须是可能的最小值价值

标签: java arrays collections


【解决方案1】:

这里的问题是,在您的 for 循环中,您使用 i = 0; 重置,但在下一次迭代中,for 循环将增加 i 等于 1,这意味着您跳过了第一个列表中的编号。我会尝试简单地将该行更改为i = -1;

【讨论】:

    【解决方案2】:

    你的问题是 if 块 - 你不应该有一个。

    我还怀疑您误解了这个问题,我将其理解为 return 1 - 运行总数的最小值

    类似这样的:

    public static long minStart(List<Integer> arr) {
        long total = 0; // long to avoid integer overflow
        long min = Long.MAX_VALUE;
        for (int n : arr) {
             total += n;
             min = Math.min(min, total);
        }
        return 1 - min;
    }
    

    为了进一步减少代码量,您可以将循环替换为:

    for (int n : arr)
         min = Math.min(min, total += n);
    

    这可能会或可能不会给人留下深刻印象,具体取决于您的观众。

    【讨论】:

    • 感谢您的代码。对于 if 语句,我的初始解决方案 - 为什么我不应该有一个? if 块中的重新分配没有执行吗?
    • 你不应该有 if 块,因为如果运行总数低于 1,你不应该做任何特别的事情。此外,你不应该在循环中更新你的答案。您应该首先找到运行总数的最小值,然后将其从 1 中取出以得到答案..
    • 您的解决方案有效。我仍然对为什么我的代码返回它所做的结果感到困惑。例如,数组 [-5,4,-2,3,1,-1,-6,-1,0,5]。您的解决方案返回 8,这是正确的。我明白为什么。我不明白为什么我的解决方案返回 3。 if 语句应该在添加 -5 后捕获,然后增加 minValue 直到它达到 6。虽然我理解您的解决方案是解决问题的最佳方法,但我很好奇为什么我的执行方式是这样的
    • @James 您的代码尝试通过将 i 设置为零来重新启动循环,但 i 在下一次迭代之前 会递增,所以 i 将是 1,而不是零,所以你跳过第一个元素,即 -5,你的答案是 5……这不是巧合。相反,请执行i = -1。您的方法也存在缺陷,因为它可能会循环无数次并且不允许 minStart 为负数。
    • 当结果应该是运行总和的起点,但运行总和应该永远不小于一时,这个结果数必须至少是一,否则约束会甚至在操作开始之前就被违反。此外,对于一个空列表,结果应该只有一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多