Java 为什么这个方法失败了?

Java 为什么这个方法失败了?,java,arrays,collections,Java,Arrays,Collections,最近在一次采访中遇到了这个问题。给定一个整数数组,找到可以用作起点的最小整数x,这样当您将数组中的每个数字添加到运行总数时,运行总数永远不会低于1。他们给我的Java函数存根包含一个列表集合,我应该返回一个长的。在我看来,这个解决方案似乎必须工作,但每个测试用例都失败了。为什么? public static long minStart(List<Integer> arr) { long minStart = 0; long runningTotal = minStar

最近在一次采访中遇到了这个问题。给定一个整数数组,找到可以用作起点的最小整数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;
}
publicstaticlongminstart(列表arr){
long minStart=0;
长时间运行总计=分钟启动;

对于(int i=0;i这里的问题是,在for循环中,您使用
i=0;
重置,但在下一次迭代中,for循环将增量
i
等于1,这意味着您跳过了列表中的第一个数字。我只需尝试将该行更改为
i=-1;
您的问题是
if
块-您不应该有一个

我还怀疑你误解了这个问题,我把它理解为返回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;
}

这可能会给人留下深刻的印象,也可能不会给人留下深刻的印象,这取决于你的听众。

为什么要递增minStart变量?你假设最小起始int至少为零。它可能是负数吗?为什么不对数组进行一次运行求和,然后求出最小值。然后使起始int等于该最小值的负数。I递增minStart,以便I ca找到起始点。起始点或minStart必须是一个正整数,并且必须是确保runningTotal永远不会低于1的最小值。我的想法是从低开始,然后再向高移动,因此第一个有效的值必须是最小可能值感谢您的代码。对于if语句,我的初始解决方案ion-为什么我不应该有一个?是否没有执行if块中的重新分配?您不应该有if块,因为如果运行总数下降到1以下,您不应该执行任何特殊操作。此外,您不应该在循环中更新您的答案。您应该首先找到运行总数的最小值,然后将其拿走从1得到答案..你的解决方案有效。我仍然不明白为什么我的代码会返回这样的结果。例如,数组[-5,4,-2,3,1,-1,-6,-1,0,5]。您的解决方案返回8,这是正确的。我理解为什么。我不理解为什么我的解决方案返回3。if语句应该在添加-5后捕获,然后递增minValue直到它为6。虽然我理解您的解决方案是解决问题的最佳方法,但我很好奇为什么我的解决方案会以这种方式执行does@James你的代码在尝试通过将i设置为零来重新启动循环,但在下一次迭代之前i会递增,因此i将为1,而不是零,因此您跳过第一个元素,即-5,您的答案是5…这不是巧合。相反,请执行
i=-1
。您的方法也有缺陷,因为它可能会循环无数次,并且不允许minStart为负值。当结果应为运行总数的起点,但运行总数应不小于1时,此结果数必须至少为1,否则即使在操作开始之前也会违反约束。此外,对于空列表,结果应仅为1。
for (int n : arr)
     min = Math.min(min, total += n);