双指针

移动零

简单#283Java时间 O(n)空间 O(1)

题目要做什么

把数组中的所有零移到末尾,并保持非零元素原有的相对顺序。直接修改数组,不创建另一个数组。

题目示例输入nums = [0, 1, 0, 3, 12]
题目示例输出[1, 3, 12, 0, 0]

01 为什么这样做

read 检查每一个位置,write 指向下一个非零数应该放置的位置。读到非零数时交换两个位置,然后向前移动 write。

始终成立的条件

[0, write) 始终是已经整理好的非零前缀。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public void moveZeroes(int[] nums) {3        int write = 0;4        for (int read = 0; read < nums.length; read++) {5            if (nums[read] != 0) {6                int temp = nums[write];7                nums[write] = nums[read];8                nums[read] = temp;9                write++;10            }11        }12    }13}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索