当前位置: 首页 > article >正文

[ 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),只使用了常数级别的额外空间。

代码实现

/**
 * @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]

http://www.kler.cn/a/488747.html

相关文章:

  • Mysql进阶篇
  • 提升 PHP 编码效率的 10 个实用函数
  • 使用docker-compose安装Redis的主从+哨兵模式
  • 高通,联发科(MTK)等手机平台调优汇总
  • 使用 C++ 实现神经网络:从基础到高级优化
  • oracle位运算、左移右移、标签算法等
  • mysql -> 达梦数据迁移(mbp大小写问题兼容)
  • Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.
  • 学习第六十四行
  • 创建一个Spring Boot项目
  • 使用PVE快速创建虚拟机集群并搭建docker环境
  • 安全运维管理 10.1环境管理
  • GPU算力平台|在GPU算力平台部署LLama3大模型的详细教程
  • system securiry: supervisor password required
  • 在 Visual Studio Code 中使用 qmake 构建和调试 Qt 项目
  • python调用window库全屏截图生成bmp位图学习
  • TrustRAG:增强RAG系统鲁棒性与可信度的创新框架
  • 儿童玩具加拿大SOR/2011-17测试安全标准
  • Transformer:深度学习的变革力量
  • ffmpeg 常用命令 案例
  • 【Uniapp-Vue3】在组件中通过props进行数据传递
  • Vue.js 组件开发:从基础到进阶
  • 蓝桥杯嵌入式速通(1)
  • Java的 BIO、NIO、AIO?分别的作用和用法
  • YCM托管YashanDB报错 /home/yashan/.yasboot/.env is not existed
  • Github 2025-01-08 C开源项目日报 Top10