JavaScript for循环重置索引失效引发循环异常问题排查
问题描述
需求为查找数组中第一组和为10的连续数字,以数组形式返回结果。
原实现思路为持续累加数组元素,直到累加器x的值大于10时,将x重置为0,同时将循环变量i赋值为变量ct以重置循环索引,预期每次重置时ct自增1,让循环从下一个元素重新开始累加,直到找到符合要求的结果。实际运行时ct始终停留在1无法递增,循环始终卡在数组索引为1的第二个元素处无法推进。
警告:运行下述错误代码可能导致页面崩溃或无响应
const arr = [2, 3, 1, 2, 7, 2, 5, 4, 5, 1, 2, 1]; function test(arr) { let x = 0; for (let i = 0; i < arr.length; i++) { let ct = 0; x = x + arr[i] if (x > 10) { x = 0; i = ct; ct++ } console.log(x) } } console.log(test(arr))
错误原因
代码属于实现逻辑错误,具体问题点如下:
- 变量作用域错误:
ct被声明在for循环块内部,每次循环迭代都会被重新初始化为0,后续的ct++操作无法保留累计值,完全起不到记录起始搜索位置的作用。 - 循环重置逻辑错误:累加和超过10时,直接将
i赋值为始终为0的ct,下一轮循环i++后固定从索引1位置重新开始累加,很快又会触发和大于10的判断,再次把i设回0,来回跳转形成死循环,永远无法推进遍历进度。 - 结果判断分支缺失:代码中没有编写累加和等于10的判断逻辑,就算遍历过程中凑出了符合要求的连续子数组,也不会识别并返回结果。
修复方案
采用滑动窗口思路实现,避免重复累加计算,同时从根源上避免死循环,修复后代码如下:
const arr = [2, 3, 1, 2, 7, 2, 5, 4, 5, 1, 2, 1]; function test(arr) { let windowStart = 0; let sum = 0; for (let i = 0; i < arr.length; i++) { sum += arr[i]; // 累加和超过10时,移动窗口左边界直到和不大于10 while (sum > 10 && windowStart <= i) { sum -= arr[windowStart]; windowStart++; } // 命中和为10的连续子数组,直接返回第一组结果 if (sum === 10) { return arr.slice(windowStart, i + 1); } } // 无符合要求的子数组时返回空数组 return []; } console.log(test(arr)); // 输出 [1, 2, 7]
修复逻辑说明:
- 用
windowStart记录当前连续累加窗口的起始索引,变量声明在循环外,不会被每次迭代重置。 - 累加和超过10时,不需要从头开始重新累加,只需要逐次减去窗口最左侧的元素,同时右移左边界,直到和回到10以内,整体时间复杂度为O(n)。
- 增加和等于10的判断分支,找到第一组符合要求的结果立刻返回,不需要完成全量遍历。
内容的提问来源于stack exchange,提问作者Qaqli
相关产品推荐
相关产品推荐

