news 2026/6/14 5:52:44

【Hot100-Java简单】/LeetCode 283. 移动零:两种 Java 高效解法详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Hot100-Java简单】/LeetCode 283. 移动零:两种 Java 高效解法详解

LeetCode 283 题 (Move Zeroes) 是一道经典的数组操作题。题目要求将数组中所有的0移动到末尾,同时保持非零元素的相对顺序,且必须原地 (In-place)操作,不能使用额外的数组空间。

本文提供两种时间复杂度的 Java 解法,分别对应“覆盖后填充”“交换”两种核心思维。


方法一:覆盖 + 补零(推荐:逻辑最清晰)

核心思路

我们可以把数组nums想象成一个栈。维护一个指针j,用来指向下一个存放非零元素的位置

  1. 第一次遍历(归位):

    遍历整个数组,只要遇到 非零元素,就直接把它“写”到 nums[j] 的位置,然后 j 后移一位。

    • 注意:这里我们通过直接覆盖来移动数据,不用管被覆盖的数字,也不用管 0 去哪了。

  2. 第二次处理(补零):

    遍历结束后,j 之前的位置存储的都是按顺序排列好的非零数。那么,从 j 到数组末尾的所有位置,理应全是 0。直接批量赋值即可。

Java 代码实现

Java

class Solution { public void moveZeroes(int[] nums) { int j = 0; // j 指向当前非零元素应该存放的位置 // 1. 第一步:将所有非零元素移到数组开头 for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { nums[j] = nums[i]; // 直接覆盖 j++; } } // 2. 第二步:将剩余位置全部填充为 0 // 使用 Arrays.fill 是 Java 中处理批量赋值最高效的方式 Arrays.fill(nums, j, nums.length, 0); } }

复杂度分析

  • 时间复杂度。我们需要遍历数组一次来移动非零数,Arrays.fill底层虽然也是循环但极快,整体仍为线性时间。

  • 空间复杂度。只使用了几个整数变量。


方法二:双指针交换(进阶:一次遍历)

核心思路

方法一在逻辑上分成了“移数”和“补零”两步。方法二试图通过交换 (Swap),在一次遍历中完成所有任务。

维护一个指针j,它的含义是:当前最左边的 0 的位置(或者说是等待被非零元素交换的位置)。

  1. 用指针i遍历数组。

  2. nums[i]非零数时:

    • 将其与nums[j]进行交换

    • 交换后,非零数归位到了左边,原来的 0 被换到了当前位置。

    • j向后移动一位,准备接收下一个非零数。

  3. nums[i]0时:

    • i继续走,j停在原地(标记这里有个 0 等待被换走)。

这种方法形象地被称为“滚雪球”:ji中间的区域就是积累的 0,我们不断把后面的非零数扔到雪球前面去。

Java 代码实现

Java

class Solution { public void moveZeroes(int[] nums) { int j = 0; // j 指向第一个 0 的位置 for (int i = 0; i < nums.length; i++) { // 只有遇到非零元素才执行操作 if (nums[i] != 0) { // 优化:只有当 i > j 时才交换 // (避免数组开头全是非零数时,自己和自己交换) if (i > j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } j++; } } } }

复杂度分析

  • 时间复杂度。严格的一次遍历。

  • 空间复杂度


总结:哪种方法更好?

特性方法一 (覆盖+补零)方法二 (双指针交换)
操作次数总是次写入 (移动 + 补零)最少 0 次(如果全是非零),最多 $N$ 次
代码可读性⭐⭐⭐⭐⭐ (利用了 Java API)⭐⭐⭐⭐ (交换逻辑稍显复杂)
推荐场景通用推荐。逻辑分离,不易出错。特殊优化。如果已知数组中 0 很少,或者写操作代价很高时使用。

对于 Java 选手,通常推荐使用方法一,因为它利用了Arrays.fill,代码更简洁,且在大多数测试用例下性能非常稳定。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 20:45:59

Bebas Neue字体完全指南:从入门到精通的现代设计解决方案

Bebas Neue字体完全指南&#xff1a;从入门到精通的现代设计解决方案 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 在当今数字设计领域&#xff0c;一款优秀的字体往往能决定项目的视觉成败。Bebas Neue作为备…

作者头像 李华
网站建设 2026/6/12 16:44:47

SQL解析革命:告别跨数据库兼容性噩梦的终极方案

SQL解析革命&#xff1a;告别跨数据库兼容性噩梦的终极方案 【免费下载链接】JSqlParser JSQLParser/JSqlParser: 这是一个用于解析和执行SQL语句的Java库。适合用于需要解析和执行SQL语句的场景。特点&#xff1a;易于使用&#xff0c;支持多种数据库的SQL语句解析和执行&…

作者头像 李华
网站建设 2026/6/13 0:40:10

Venera漫画阅读器终极指南:一站式解决你的漫画管理烦恼

还在为手机里装了五六个漫画APP而烦恼吗&#xff1f;本地漫画格式不兼容、网络漫画资源分散、阅读体验参差不齐——这些问题在Venera漫画阅读器面前都将迎刃而解。作为一款基于Flutter开发的全平台开源应用&#xff0c;Venera重新定义了漫画阅读的标准&#xff0c;为你带来前所…

作者头像 李华
网站建设 2026/6/14 1:35:59

PyInstaller解包工具终极指南:轻松提取Python可执行文件

PyInstaller解包工具终极指南&#xff1a;轻松提取Python可执行文件 【免费下载链接】pyinstxtractor PyInstaller Extractor 项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor PyInstaller解包工具是一款专为解包PyInstaller打包的Python可执行文件而设计的…

作者头像 李华
网站建设 2026/6/14 2:35:43

Illustrator脚本革命:从重复劳动到创意主导的设计工作流变革

在深夜的设计工作室里&#xff0c;资深设计师李明正对着屏幕叹气。他需要为30个产品图更新价格标签&#xff0c;每个标签都要手动修改文本、调整位置、检查对齐。这样的重复性工作已经耗去了他整个下午&#xff0c;而真正的创意设计还等着他来完成。这不仅仅是李明一个人的困境…

作者头像 李华
网站建设 2026/6/10 16:54:12

音频格式转换工具:处理加密音乐文件的实用方法

音频格式转换工具&#xff1a;处理加密音乐文件的实用方法 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gitc…

作者头像 李华