JavaScript sumPairs函数数组顺序异常、返回结果错误排查
sumPairs函数异常排查
已确认的代码问题
- 遍历过程非法修改数组:外层使用
for...of遍历arr时,循环内执行arr.splice(0,1)持续删除数组首元素,直接打乱遍历顺序,会出现元素跳过、下标错位的问题,这也是数组项顺序被改动的直接原因 - 内层循环逻辑错误:内层循环固定从下标1开始遍历,没有和当前外层元素的位置绑定,会重复匹配位置靠前的元素,无法保证配对的先后顺序
- 下标判断失效:
lastIndex记录的是数组被截断后的相对下标,每次splice操作后下标对应的实际元素位置已经偏移,完全不能作为「数对第二个元素最早出现位置」的判断依据 - 冗余参数设计:函数定义里的
arr、result形参没有实际存在的必要,反而会因为slice、splice操作增加额外的性能开销和出错概率
修正实现
不需要嵌套循环+截断数组的复杂逻辑,用哈希表记录已经遍历过的元素,单次遍历即可得到结果,时间复杂度O(n),全程不会修改传入的原数组:
function sumPairs(ints, s) { const seen = new Map(); for (let i = 0; i < ints.length; i++) { const current = ints[i]; const need = s - current; if (seen.has(need)) { return [need, current]; } if (!seen.has(current)) { seen.set(current, i); } } } // 测试用例验证 console.log(sumPairs([10, 5, 2, 3, 7, 5], 10)); // 输出[3,7],符合预期 console.log(sumPairs([1, -2, 3, 0, -6, 1], -6)); // 输出[0,-6],符合预期 console.log(sumPairs([1, 2, 3, 4, 1, 0], 2)); // 输出[1,1] console.log(sumPairs([0, 0, -2, 3], 2)); // 无匹配返回undefined console.log(sumPairs([1, 4, 8, 7, 3, 15], 8)); // 输出[1,7] console.log(sumPairs([4, 3, 2, 3, 4], 6)); // 输出[4,2]
逻辑说明
从左到右顺序遍历数组时,每遇到一个数就检查之前遍历过的数里有没有能和它相加等于目标值的项,第一次命中的配对,就是所有合法配对中第二个元素下标最小的,完全符合「最早出现的完整数对」的要求。
内容的提问来源于stack exchange,提问作者conradQQ
相关产品推荐
相关产品推荐

