Java 字段从方法返回后有错误的值,而用 void 方法计算它会产生正确的结果

Java field has wrong value after returned from a method, while calculating it with a void method produces correct result

下面是我编写的一段代码,用于计算给定数组的平衡索引。

public class Equilibrium{
    private int lowerSum =0;

     public int equilibrium(int[] A) {
        for(int i=0; i<A.length;i++)
        {
            if(lowerSum(A, i) == upperSum(A,i))
            {
                return i;
            }
        }
        return -1;

     }

    private int lowerSum(int[] ar, int index)
    {
        if(index == 0)
            return 0;
        lowerSum += ar[--index];
        return lowerSum;
    }

    //This can be fixed accordingly in a similar way lowerSum
    //was implemented to have a time complexity of O(n) but
    //this is not relevant to the problem here
    private int upperSum(int[] ar, int index)
    {
        int sum=0;
        for(int i= index+1; i<ar.length; i++)
        {
            sum+=ar[i];
        }
        return sum;
    }
}

以上代码没有产生正确的结果。例如以下测试:

  assertEquals(1, solution.solution(new int[]{1,2,1}));
  assertEquals(3, solution.solution(new int[]{3,5,8,9,5,3,8}));

第一个通过,第二个没有通过。这是因为计算 lowerSum 字段被 +1 错误。 但是,对代码进行以下更改会产生正确的结果:

private int lowerSum =0;

 public int solution(int[] A) {
    for(int i=0; i<A.length;i++)
    {
        lowerSum(A, i);
        if( lowerSum== upperSum(A,i))
        {
            return i;
        }
    }
    return -1;

 }    

private void lowerSum(int[] ar, int index)
{
    if(index == 0)
        lowerSum = 0;
    else
        lowerSum += ar[--index];

}

有人可以向我解释为什么会这样吗?

在您的第一个实现中,您只需 return 0。在您的第二个实现中,您在 returning lowerSum.

之前将 lowerSum 设置为 0

固定:

private int lowerSum(int[] ar, int index)
{
    if(index == 0) {
        lowerSum = 0;
    } else {
        lowerSum += ar[--index];
    }
    return lowerSum;
}