You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:57:47