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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:54:28