[ LeetCode 75 ] 283 移动零(JavaScript)

283 移动零

题目描述

LeetCode 283 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:

输入: nums = [0,1,0,3,12]

输出: [1,3,12,0,0]

解题思路

目标是将数组中的所有 0 移动到数组的末尾,同时保持非零元素的相对顺序不变。

选择使用合适的策略(双指针法):使用两个指针来遍历数组,一个指针用于遍历整个数组,另一个指针用于记录非零元素应该放置的位置。

步骤解析

  1. 初始化一个变量

    a. 变量 lastNonZeroIndex ,来跟踪最后一个非0元素的位置

  2. 遍历数组,

    a. 使用一个循环遍历数组中的每个元素。

    b. 当遇到非0元素时,将其赋值给 nums[lastNonZeroIndex] ,并将 lastNonZeroIndex 向前移动1位

  3. 填充 0

    a. 在结束遍历后,使用另一个循环,从 lastNonZeroIndex 的位置到数组末尾填充0。

时间和空间复杂度

  • 时间复杂度:O(n),因为数组只被遍历了一次。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

代码实现

js 复制代码
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
function moveZeroes(nums) {

  // 1. 初始化一个变量 lastNonZeroIndex ,来跟踪最后一个非零元素的位置
  let lastNonZeroIndex = 0;

  // 2. 遍历数组,使用一个循环遍历数组中的每个元素。
  // 当遇到非零元素时,将其赋值给 nums[lastNonZeroIndex] ,并将 lastNonZeroIndex 向前移动一位
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== 0) {
      nums[lastNonZeroIndex] = nums[i];
      lastNonZeroIndex++;
    }
  }

  // 3. 填充 0
  // 在结束遍历后,使用另一个循环,从 lastNonZeroIndex 的位置到数组末尾填充零。
  for (let i = lastNonZeroIndex; i < nums.length; i++) {
    nums[i] = 0;
  }

  return nums;
}

// 示例用法
const nums = [0, 1, 0, 3, 12];
moveZeroes(nums);
console.log(nums);  // 输出: [1, 3, 12, 0, 0]
相关推荐
j_xxx404_37 分钟前
C++算法:哈希表(简介|两数之和|判断是否互为字符重排)
数据结构·c++·算法·leetcode·蓝桥杯·力扣·散列表
Aaron15881 小时前
RFSOC+VU13P+RK3588的核心优势与应用场景分析
嵌入式硬件·算法·matlab·fpga开发·信息与通信·信号处理·基带工程
优家数科1 小时前
精准预测:基于多维用水量的滤芯寿命预警算法
算法
脱氧核糖核酸__1 小时前
LeetCode热题100——189.轮转数组(题解+答案+要点)
数据结构·c++·算法·leetcode
贾斯汀玛尔斯2 小时前
每天学一个算法-快速排序(Quick Sort)
数据结构·算法
炽烈小老头2 小时前
【每天学习一点算法 2026/04/16】逆波兰表达式求值
学习·算法
优家数科2 小时前
水质监测不准?解密云端 TDS 数据建模纠偏算法
算法
木井巳2 小时前
【递归算法】组合总和
java·算法·leetcode·决策树·深度优先·剪枝
冴羽2 小时前
请愿书:Node.js 核心代码不应该包含 AI 代码!
前端·javascript·node.js
mmmmm123422 小时前
深入 DOM 查询底层:HTMLCollection 动态原理与 querySelectorAll 静态快照解析
前端·javascript