数据结构刷题 ——001
移动零:283. 移动零 - 力扣(LeetCode)

算法的思路:
利用双指针:
cur 往前进行寻找非0 的数
pre 负责标记该点没有处理过的下标
cur 找到了就进行交换
pre 进行交换完了,该点也处理完毕,我们就往后就行处理 0
【0,pre-1】是处理好的
【pre , cur 】都是0
【cur ,array.length-1】未处理的
这个方法跟我们前面学习的数据结构的快排的双指针差不多
import java.util.Arrays;public class _001 {public static void main(String[] args) {Solution solution = new Solution();int[] nums = new int[]{2, 0, 1, 0, 4, 5, 23, 0, 1, 0};System.out.println("处理前:" + Arrays.toString(nums));solution.moveZeroes(nums);System.out.println("处理后:" + Arrays.toString(nums));// 预期输出:[2, 1, 4, 5, 23, 1, 0, 0, 0, 0]}static class Solution {public void moveZeroes(int[] nums) {if(nums.length <= 1){return;}int cur = 0;int prev = 0;for (cur = 0; cur < nums.length; cur++) {if(nums[cur] != 0){swap(nums,prev,cur);prev++;}}}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}
第二种
算法的思路:
利用双指针:
cur 往前进行寻找非0 的数
pre 负责标记该点没有处理过的下标
cur 找到了就进行交换
pre 进行交换完了,该点也处理完毕,我们就往后就行处理 0
【0,pre】是处理好的
【pre+1 , cur -1 】都是0
【cur ,array.length-1】未处理的
package _001;import java.util.Arrays;public class _001_secord {public static void main(String[] args) {Solution solution = new Solution();int[] nums = new int[]{2, 0, 1, 0, 4, 5, 23, 0, 1, 0};System.out.println("处理前:" + Arrays.toString(nums));solution.moveZeroes(nums);System.out.println("处理后:" + Arrays.toString(nums));// 预期输出:[2, 1, 4, 5, 23, 1, 0, 0, 0, 0]}static class Solution {public void moveZeroes(int[] nums) {if(nums.length <= 1){return;}int cur = 0;int prev = -1;for (cur = 0; cur < nums.length; cur++) {if(nums[cur] != 0){prev++;swap(nums,prev,cur);}}}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}
1. 第一种划分:
-
【0,pre-1】:已处理好的非 0 元素区间(全部为非 0,且顺序保持原始)。
-
【pre,cur】:全为 0 的区间(这些 0 是待移到末尾的)。
-
【cur,array.length-1】:未处理的区间(包含未检查的非 0 和 0)。
逻辑适配:对应
prev初始值为0的实现(如第一个代码)。- 初始时
pre=0,【0,pre-1】为空(还未处理元素)。 - 当
cur找到非 0 元素时,交换pre和cur,此时pre位置变为非 0,加入【0,pre-1】区间,然后pre++(扩大已处理区间,同时【pre,cur】成为新的 0 区间)。
- 初始时
2. 第二种划分:
-
【0,pre】:已处理好的非 0 元素区间(全部为非 0)。
-
【pre+1,cur-1】:全为 0 的区间。
-
【cur,array.length-1】:未处理的区间。
逻辑适配:对应
prev初始值为-1的实现(如第二个代码)。- 初始时
pre=-1,【0,pre】为空。 - 当
cur找到非 0 元素时,先pre++(此时pre指向待填充位置),交换后【0,pre】成为新的已处理区间,【pre+1,cur-1】自然成为 0 区间。
- 初始时
核心一致性
两种划分的本质完全相同:
- 都是通过
cur遍历寻找非 0 元素,通过pre标记 “下一个非 0 元素应该放置的位置”。 - 交换后,
pre始终指向 “已处理区间的最后一个非 0 元素”(或其前一位),确保pre左侧全为非 0,pre和cur之间全为 0,未处理区间在cur右侧。
