JS实现数组相等分割索引功能报错:测试用例未返回预期值3如何排查
平衡索引查找代码错误排查
功能需求
实现功能:寻找数组的索引N,使得N左侧所有整数的和等于右侧所有整数的和,不存在符合要求的索引则返回-1。
故障表现
提供的原始代码运行findEvenIndex([1,2,3,4,3,2,1])时,没有返回预期结果3,左右切片求和结果不匹配。
原始代码
function findEvenIndex(arr) { var sum = i => i.reduce((a, b) => a + b), l = arr.length; for (let j = 0; j <= l; j++) { if (sum(arr.slice(0, j - 1)) === sum(arr.slice(j, l))) { return j } else { continue; } } return -1 }
错误原因
- 左侧切片逻辑错误:平衡索引j的左侧元素范围是索引0到j-1,
slice(0,j)刚好符合该范围(slice结束索引不包含),原始代码写为slice(0,j-1)会漏掉索引j-1的元素,导致求和结果偏小。 - 右侧切片逻辑错误:平衡索引j的右侧元素范围是索引j+1到末尾,原始代码写为
slice(j,l)会包含j位置本身的元素,导致求和结果偏大。 - 循环边界错误:数组合法索引范围是0到
l-1,原始代码循环条件为j <= l,会遍历到超出数组范围的无效索引。 - 求和函数容错不足:reduce未设置初始值0,当传入空数组(j=0时左侧为空、j为最后一位时右侧为空)时会直接抛出错误。
修正后代码
function findEvenIndex(arr) { // 给reduce添加初始值0,兼容空数组求和场景 const sum = i => i.reduce((a, b) => a + b, 0); const len = arr.length; // 修正循环边界,只遍历合法索引 for (let j = 0; j < len; j++) { // 修正左右切片逻辑,排除当前j位置的元素 const leftSum = sum(arr.slice(0, j)); const rightSum = sum(arr.slice(j + 1)); if (leftSum === rightSum) { return j; } } return -1; }
验证结果
调用findEvenIndex([1,2,3,4,3,2,1])可正确返回预期结果3。
内容的提问来源于stack exchange,提问作者untitiledunmastered
相关产品推荐
相关产品推荐

