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
相关产品推荐
相关产品推荐

