下面是我编写的用于计算给定数组的平衡索引的以下代码。
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];
}
有人可以向我解释一下为什么会发生这种情况吗?
最佳答案
在第一个实现中,您只需返回 0。在第二个实现中,您在返回 lowerSum
之前将 lowerSum
设置为 0。
已修复:
private int lowerSum(int[] ar, int index)
{
if(index == 0) {
lowerSum = 0;
} else {
lowerSum += ar[--index];
}
return lowerSum;
}
关于Java 字段从方法返回后有错误的值,而使用 void 方法计算它会产生正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31733270/