问题:- 在这个问题中,我们必须找到给定数组的主元索引。根据给定的定义(问题中给出),它是索引中的那个点,如果我们计算它左边和右边的数字总和,它们都会相等。
示例 输入:nums = [1,7,3,6,5,6]
输出:3 说明:
主元索引为3。 左和 = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11
右和 = nums[4] + nums[5] = 5 + 6 = 11
我尝试的方法和逻辑
我计算数组的总和,然后使用 for 循环从数组中向后(从右到左)迭代,每次从总和中减去该元素并将其与另一个从右侧计算总和的循环进行比较,这样当它们相等时返回该索引元素。
但我找不到错误
相同的代码
import java.util.*;
public class webs{
public static void main(String[] args){
int arr[] = {1, 7, 3, 6, 5, 6};
System.out.println(Calc(arr));
}
static int Calc(int arr[]){
int sum = 0;
int lsum = 0;
//this loop is for sum
for(int i =0; i < arr.length; i++){
sum += arr[i];
}
//this loop is for calculating sum from reverse
for(int j= arr.length - 1; j > 0; j--){
lsum += arr[j];
sum -= arr[j];
if(lsum == sum){
return arr[j];
}
else{
return -1;
}
}
return 0;
}
}
请指出其中的错误。
方法
for
中的Calc
循环最多只会执行一次迭代,因为它包含一个if-else
,其中if
都返回一个值,并且else
都返回一个值。如果您使用调试器运行代码,您会发现这一点。
当我将您的代码复制到 Eclipse 时,它警告我
j--
循环的 for
部分是 死代码。换句话说,由于循环体内有 if-else
语句,它永远不会被执行。
如果
lsum
不等于sum
那么你需要继续下一个循环迭代。因此,您需要删除 else
。
此外,方法
Calc
需要返回索引而不是元素。因此而不是
return arr[j];
你应该
return j;
如果
for
循环终止,则意味着您没有找到枢轴点,因此该方法应返回 -1(负一)而不是零。因此方法 Calc
的最后一行应该是
return -1;
此外,由于您向后迭代数组,因此
lsum
最初应包含所有数组元素的总和,并且 sum
应为零。事实上,您要么需要反转 sum
和 lsum
,要么向前而不是向后迭代数组。
向后迭代数组时,终止条件应该是
j >= 0
而不是
j > 0
因为这样你就不会迭代数组中的第一个元素。
最后,您需要在测试
sum
是否等于sum
之后调整lsum
的值。这是我对您的代码的重写,包含我上面描述的更改。我添加了
print
语句,以便您可以[部分]查看正在发生的情况,但正如我之前所说,您需要学习如何调试代码。
static int Calc(int arr[]){
int sum = 0;
int lsum = 0;
//this loop is for sum
for(int i =0; i < arr.length; i++){
lsum += arr[i];
}
//this loop is for calculating sum from reverse
for(int j= arr.length - 1; j >= 0; j--){
lsum -= arr[j];
System.out.printf("%d. lsum = %d , sum = %d%n", j, lsum, sum);
if(lsum == sum){
System.out.println("Returning: " + j);
return j;
}
sum += arr[j];
}
System.out.println("Returning: -1");
return -1;
}
当我使用问题中的示例数组调用方法 Calc
时,会打印以下内容:
5. lsum = 22 , sum = 0
4. lsum = 17 , sum = 6
3. lsum = 11 , sum = 11
Returning: 3
internal class Program
{
private static void Main(string[] args)
{
int[] arr = { 2,2,2,2,2,2,2,2,2,4 };
int middle = arr.Length / 2;
int first = 0; int last = arr.Length - 1;
int counter = 0;
while (true)
{
if(Sumfun(arr,first,middle-1) > Sumfun(arr, middle+1, last))
{
middle--;
}
else if( Sumfun(arr, first, middle-1) < Sumfun(arr, middle + 1, last))
{
middle++;
}
else {
Console.WriteLine(middle);
break; }
counter++;
if( counter == arr.Length/2 +1 ) {
Console.WriteLine("There is no pivit point");
break;
}
}
int Sumfun(int[] arr, int i, int j)
{
int sum = 0;
for (int k = i; k <= j; k++)
{
sum = sum + arr[k];
}
return sum;
}
}
}