为什么此方法失败?

时间:2020-07-27 17:36:26

标签: java arrays collections

最近在一次采访中遇到了这个问题。给定一个整数数组,找到可以用作起点的最小整数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;
}

2 个答案:

答案 0 :(得分:1)

这里的问题是,在您的for循环中,您使用i = 0;进行重置,但是在下一个迭代中,for循环将i递增为1,这意味着您跳过列表中的第一个数字。我只是尝试简单地将该行更改为i = -1;

答案 1 :(得分:0)

您的问题是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);

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