我的JS数组移零函数相邻零场景运行失败,求现有代码问题排查
问题原因分析
你代码的核心问题出在第一个遍历数组的循环逻辑里:
- 当你用
arr.splice(i,1)删除当前位置的0后,数组的长度会自动减1,原数组中位于i之后的所有元素都会往前移动一个位置 - 如果当前被删除的0后面紧跟的也是0,这个新挪到i位置的0会被直接跳过——因为你每次循环都会执行i自增操作,下一轮循环直接检查i+1的位置,就漏掉了这个相邻的0
比如你举的输入[1,0,0,1]的例子:
- i=1时,元素是0,执行splice删除后数组变为
[1,0,1],k=1 - 循环自动将i自增为2,此时i=2对应的元素是1,原本位置i=1的第二个0就被漏掉没有处理
代码修复方案
只需要在你删除零的逻辑后增加一行i--,抵消循环的自动i自增,确保删完零后下一轮还是检查当前i位置的新元素即可,修复后代码如下:
var moveZeros = function (arr) { var k=0; for (var i=0;i<=arr.length-1;i++){ var s=arr[i]; if (s===0){ arr.splice(i,1); k++; i--; // 新增这行,避免跳过相邻的零 } } for (var j=0;j<=k-1;j++){ arr.push(0); } return arr }
j<=k-1的逻辑解释
k是你统计的从原数组中删除的零的总个数,你需要在数组末尾补充相同数量的零:
- j从0开始计数,当k为n时,j的取值是0、1、...、n-1,刚好循环n次,对应push n个零,和你删除的零数量完全匹配
- 如果你写
j<=k,那j的取值会是0到n,共循环n+1次,会多push一个零,结果不符合预期
这个写法和更常见的j < k的判断逻辑是完全等价的,只是写法不同而已。
内容的提问来源于stack exchange,提问作者Mohd Saad
相关产品推荐
相关产品推荐

