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

如何不排序将数组中的0元素移至末尾并保持非零元素顺序

将数组中的0移至末尾(保持非零元素原始顺序)

以下是几种无需排序的解决方案,完全满足你的需求:

方法1:分离非零元素 + 补充0

思路直观,先提取所有非零元素,再根据原数组长度补充对应数量的0:

const arr = [4,5,1,0,3,8,0,9,2,0,4];
// 过滤出所有非零元素
const nonZeros = arr.filter(num => num !== 0);
// 创建对应长度的0数组
const zeros = new Array(arr.length - nonZeros.length).fill(0);
// 拼接得到结果
const result = nonZeros.concat(zeros);
console.log(result); // [4,5,1,3,8,9,2,4,0,0,0]

优势:代码简洁易读,完全保留非零元素的原始顺序,适合大多数场景。

方法2:原地双指针修改(空间复杂度O(1))

如果不想创建新数组,可在原数组上直接操作,节省内存:

const arr = [4,5,1,0,3,8,0,9,2,0,4];
let left = 0;

// 把所有非零元素移到数组左侧
for (let right = 0; right < arr.length; right++) {
  if (arr[right] !== 0) {
    arr[left] = arr[right];
    left++;
  }
}

// 将左侧之后的所有位置填充为0
for (let i = left; i < arr.length; i++) {
  arr[i] = 0;
}

console.log(arr); // [4,5,1,3,8,9,2,4,0,0,0]

优势:无需额外创建数组,空间效率更高,适合处理大型数组。

方法3:遍历交换元素(原地实现)

通过交换非零元素和0的位置,逐步将0移至末尾:

const arr = [4,5,1,0,3,8,0,9,2,0,4];
let zeroIndex = 0;

for (let i = 0; i < arr.length; i++) {
  if (arr[i] !== 0) {
    // 交换当前非零元素与第一个未处理的0的位置
    [arr[zeroIndex], arr[i]] = [arr[i], arr[zeroIndex]];
    zeroIndex++;
  }
}

console.log(arr); // [4,5,1,3,8,9,2,4,0,0,0]

优势:同样是原地操作,交换逻辑更直观,适合理解指针类操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:25:26