数组平衡点查找代码输出-1错误,请求排查(附C++实现)
代码问题排查与修正
你的代码存在几个关键问题,导致无法正确找到平衡点:
1. 数组索引越界
C++数组采用0-based索引,有效范围是0到n-1,但你的循环用了i从1到n,访问a[i]会超出数组边界,触发未定义行为(比如读取垃圾值,导致总和计算错误)。
2. 平衡点判断逻辑错误
当前判断条件if(tempsum==sum+a[i])完全不符合平衡点的定义:
- 平衡点要求当前位置前所有元素的和 = 当前位置后所有元素的和
- 你的变量逻辑混乱:
sum在循环中是当前位置后方元素的和,tempsum是当前位置及后方元素的和,两者的关系无法直接对应平衡点的判断条件。
3. 遍历方向错误
题目要求找第一个平衡点(从左到右的第一个符合条件的位置),但你从右往左遍历,找到的是最后一个符合条件的位置,不符合需求。
4. 变量类型溢出风险
数组元素是long long类型,但sum和tempsum用了int,当数组元素总和超过int的取值范围时,会发生溢出,导致计算结果错误。
修正后的代码
//{ Driver Code Starts #include <iostream> using namespace std; // } Driver Code Ends class Solution{ public: // Function to find equilibrium point in the array. // a: input array // n: size of array int equilibriumPoint(long long a[], int n) { // 边界情况:数组只有一个元素,直接返回1 if(n == 1) return 1; // 计算数组总总和,用long long避免溢出 long long totalSum = 0; for(int i = 0; i < n; i++){ totalSum += a[i]; } long long leftSum = 0; for(int i = 0; i < n; i++){ // 总总和 = leftSum + a[i] + rightSum // 平衡点要求leftSum == rightSum,即totalSum - a[i] == 2*leftSum if(totalSum - a[i] == 2 * leftSum){ // 返回1-based索引 return i + 1; } leftSum += a[i]; } // 没有找到平衡点 return -1; } };
修正说明
- 改用0-based索引遍历数组,避免越界;
- 用
long long类型存储总和,防止溢出; - 从左到右遍历,确保找到第一个平衡点;
- 正确的判断逻辑:利用总总和 = 左和 + 当前元素 + 右和,当左和等于右和时,总总和 - 当前元素 = 2*左和。
内容的提问来源于stack exchange,提问作者iamcoding
相关产品推荐
相关产品推荐

