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

我的JS数组移零函数相邻零场景运行失败,求现有代码问题排查

问题原因分析

你代码的核心问题出在第一个遍历数组的循环逻辑里:

  • 当你用arr.splice(i,1)删除当前位置的0后,数组的长度会自动减1,原数组中位于i之后的所有元素都会往前移动一个位置
  • 如果当前被删除的0后面紧跟的也是0,这个新挪到i位置的0会被直接跳过——因为你每次循环都会执行i自增操作,下一轮循环直接检查i+1的位置,就漏掉了这个相邻的0
    比如你举的输入[1,0,0,1]的例子:
  1. i=1时,元素是0,执行splice删除后数组变为[1,0,1],k=1
  2. 循环自动将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:06:03