JavaScript数组平衡索引查找功能实现错误排查
解决JavaScript数组平衡索引查找返回undefined的问题
看起来你的代码在查找平衡索引时存在几个关键逻辑漏洞,导致明明找到正确位置却返回了undefined。我们来逐一分析并修复:
原代码的核心问题
- 缺少匹配成功的返回逻辑:当找到左右元素和相等的索引时,你的代码没有返回当前索引值,递归调用后这个正确结果没有被传递出来,最终函数自然返回undefined。
- 错误的终止条件:你判断
arrPart2 === 0时返回-1是完全错误的——比如数组最后一个元素的右侧和必然为0,如果左侧和也为0,那它就是合法的平衡索引,不能直接排除。 - 递归未处理遍历完成的情况:当所有索引都检查完毕仍未找到平衡索引时,没有返回-1的逻辑,会导致递归越界或者无返回值。
修复后的递归版本代码
function findEvenIndex(arr) { // 递归检查函数,参数i为当前要检查的索引 function check(i) { // 终止条件:遍历完所有索引仍未找到,返回-1 if (i >= arr.length) { return -1; } // 计算左侧元素总和 const leftSum = arr.slice(0, i).reduce((accumulator, current) => accumulator + current, 0); // 计算右侧元素总和 const rightSum = arr.slice(i + 1).reduce((accumulator, current) => accumulator + current, 0); if (leftSum === rightSum) { // 找到平衡索引,返回当前索引值 return i; } // 未找到则递归检查下一个索引 return check(i + 1); } // 从索引0开始检查 return check(0); }
更高效的迭代优化版本
上面的递归版本虽然能解决问题,但每次切片和求和会导致O(n²)的时间复杂度,对于大数组效率较低。我们可以优化为一次遍历的O(n)版本:
function findEvenIndex(arr) { // 先计算数组的总元素和 const totalSum = arr.reduce((accumulator, current) => accumulator + current, 0); let leftSum = 0; for (let i = 0; i < arr.length; i++) { // 右侧和 = 总和 - 左侧和 - 当前元素 const rightSum = totalSum - leftSum - arr[i]; if (leftSum === rightSum) { return i; } // 左侧和累加当前元素,准备下一个索引的计算 leftSum += arr[i]; } // 遍历结束未找到平衡索引,返回-1 return -1; }
测试验证
用你的测试数组[1,100,50,-51,1,1]测试上述代码,都会返回预期的1,符合要求。
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

