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

JS统计二进制数组最长连续1 偶发异常如何修复

统计二进制数组最长连续1的问题排查与修复

问题现象

需要实现函数统计二进制数组中最长连续1的个数,传入测试用例[1,1,0,1]时结果看似正确实际为巧合,但运行时偶发数组长度异常、返回值不符合预期的问题,原实现代码如下:

let nums = [1, 1, 0, 1, 1, 1];

var findMaxConsecutiveOnes = function(nums) {
  let val = 0;
  if (nums.length >= 1) {
    console.log(nums.sort().reverse());
    for (i = 0; i <= nums.length - 1; i++) {
      if (nums[i] === nums[i + 1]) {
        val++;
      } else {
        console.log(val);
        return val;
      }
    }
    console.log(val);
    return 0;
  }
};

findMaxConsecutiveOnes(nums)

代码存在的核心问题

  • 直接调用nums.sort().reverse()修改了原数组的元素顺序,彻底破坏了元素原本的连续位置关系。排序后所有0和1会各自聚合,完全失去了“连续”统计的前提,结果必然错误。
  • 循环变量i未用let/const声明,会泄漏为全局变量,多场景调用时i的残留值会污染循环逻辑,直接导致索引越界、长度判断异常的偶发问题。
  • 逻辑没有记录最长连续值的历史最大值,只要碰到相邻元素不相等就直接return,只会返回第一段连续相同元素的长度,完全不会遍历完数组所有分段。
  • 计数初始值和边界判断错误:计数从0开始,遇到连续相等元素才+1,最终统计的长度会比实际值少1;当遍历到数组最后一个元素时,nums[i+1]取到undefined,会错误触发相等判断失败的分支;数组长度小于1时无返回值,会得到undefined。

正确实现代码

var findMaxConsecutiveOnes = function(nums) {
  // 维护当前连续1长度、历史最大连续1长度
  let currentCount = 0;
  let maxCount = 0;
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] === 1) {
      currentCount++;
      // 遍历过程中实时更新最大值
      maxCount = Math.max(maxCount, currentCount);
    } else {
      // 碰到0重置当前计数
      currentCount = 0;
    }
  }
  return maxCount;
};

该实现不会修改原数组,一次遍历即可完成统计,时间复杂度O(n),空间复杂度O(1),覆盖全0、全1、空数组等所有边界场景。

内容的提问来源于stack exchange,提问作者Tobin Palmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:02:01