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

leetcode hot 100 之【LeetCode 283. 移动零】 java实现

LeetCode 283. 移动零

题目描述

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

示例:

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

说明:

  • 必须在单次遍历中修改数组,并在不接受任何额外空间的条件下完成。

Java 实现解法

方法一:双指针法
class Solution {public void moveZeroes(int[] nums) {int nonZeroIndex = 0; // 非零元素的索引for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {nums[nonZeroIndex++] = nums[i]; // 将非零元素移动到数组前面}}// 从非零元素的下一个索引开始,将数组填充为0while (nonZeroIndex < nums.length) {nums[nonZeroIndex++] = 0;}}
}

解题思路

  • 双指针法:使用两个指针 nonZeroIndexinonZeroIndex 用于记录数组中下一个非零元素应该放置的位置,而 i 用于遍历数组。
  • 在遍历数组的过程中,如果当前元素 nums[i] 不为 0,则将其赋值给 nums[nonZeroIndex],并将 nonZeroIndex1
  • 如果当前元素为 0,则不进行操作,继续遍历。
  • 当遍历完成后,nonZeroIndex 之后的数组位置都应该是 0,因此可以通过一个while循环将这些位置填充为 0

这种方法的时间复杂度是 O(n),其中 n 是数组 nums 的长度,因为我们只遍历了一次数组。空间复杂度是 O(1),因为我们没有使用任何额外的空间,只是在原地修改了数组。

注:来源leetcode网站


http://www.mrgr.cn/news/51023.html

相关文章:

  • 单片机探秘:从理论到应用
  • 2025年国考报名流程详细图解—新手版
  • JavaScript中的面向对象编程(OOP) - 终极指南
  • 【C语言】你不知道的知识小盲区——柔性数组
  • 【进阶OpenCV】 (14)-- 人脸识别 -- LBPH 算法
  • 详解tar.gz, tar.xz, tar, gz后缀文件的区别
  • Windows的Conda环境下使用PlotNeuralNet来绘制神经网络
  • 《最优化方法》
  • 7万字Java后端面试题大全(附答案)——持续更新
  • Python案例 | 测试网络的下载速度上传速度和 ping 延迟
  • Karmada核心概念
  • ARP欺骗的多种手法
  • SCALABLEANDEFFECTIVE IMPLICIT GRAPH NEURALNETWORKS ON LARGEGRAPHS
  • Java面向对象六大设计原则总结1
  • k8s的微服务
  • ComfyUI现已上线Neolink.AI,AI 绘画从此轻松驾驭!
  • 从100次AI产品经理面试中提炼:190+个关键问题及其详细解答
  • C++list
  • 总结拓展十四:批次管理(2)
  • python源码:指定麦克风/音响播放歌曲