如何不排序将数组中的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
相关产品推荐
相关产品推荐

