如何在数组中找到一个元素,使得左数组的总和等于右数组的总和

How to find an element in array such that sum of left array is equal to sum of right array

这里是代码应该生成的输入和输出:

解释:如果 2 是分区,那么:1+ 4=5(LHS)5+0=5(RHS) 应该打印 2,但在我的例子中我没有得到输出。

我用这样的逻辑尝试了我的代码......第 n 个元素将出现在数组之间的某处。因此,考虑 arr 的元素之和,直到第 n 个元素为 LHS,从第 n 个元素开始,直到 arr 的末尾为 RHS。我还添加了一个 while 循环,它增加了指向元素 n。

#include <iostream.h>
#include <conio.h>
void main(){
   int arr[5],arr2[5],i,j=0,k=0,n=1;
   cout<<"input_arr\n";
   for(i=0;i<5;i++)
    cin>>arr[i];

   while(n<=5)
{
   for(i=n;i<5;n++)
      j+=arr[i];   //sum of right side arr from n-th   element
   for(i=0;i<n;i++)
    k+=arr2[i];  //sum of left side arr till n-th element
   if(k==j)
    cout<<"\n"<<arr[n];  // prints the equilbrium element
   else
         n++;
}
    getch();
}

我会给你一些提示,指导你找到解决方案:

  1. 一次计算数组中的总和。我们称它为 totalSum.
  2. 进行第二遍并计算 partialSum,直到您已处理的位置(但不包括)。假设这是 i,值为 a[i]。如果totalSum - partialSum - a[i] = partialSum,那么位置i就是你的答案,a[i]就是它的值

首先,如果我理解正确的话,你想用这个方法在每次迭代时重置 j, k。

其次,出于某种原因,第二个 for 循环递增 n 而不是 i。

第三,您还声明了 arr2,而不是对其进行初始化,并出于某种原因将 arr2 中的值添加到 k。

您也包括了中位数。尝试 n = 2。

j = arr[2] + arr[3]+arr[4] = 2 + 5 + 0 = 7
k = arr[0] + arr[1] = 1 + 4 = 0

对 while 循环的提议更改(以保持相同的方法):

while (n <= 5) {
    j = 0; k = 0;
    for (i = n+1; i < 5; i++) {
        j+= arr[i];
    }
    for (i = 0; i < n; i++) {
        k+= arr[i]
    }
    if (k == j) {
        cout << "\n" << arr[n];
        break; //you should end the for loop here
    }
    n++;
}

当您对数组的右侧求和时,您从平衡元素开始:

假设 n = 2 并且您的输入是 [1, 4, 2, 5, 0]

while(n<=5) {
  for(i=n;i<5;n++)
      j+=arr[i];   //sum of right side arr from n-th   element
}

数组右侧的求和将从 i = 2 开始,因此它将是 2 + 5 + 0 而不是 5 + 0

调试此类问题的一种快速简便的方法是打印每个步骤正在做什么(在您的情况下,它选择哪个索引求和)这样您就可以快速诊断您是否正在做一些您没有做的事情应该。

此外,您当前的方法不是最佳方法,但它是一个很好的起点。我敦促您在使用此解决方案后尝试不同的方法。