使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移
java
class Solution {
public void moveZeroes(int[] nums) {
// left:下一个非0元素要放的位置;right:遍历指针
int n = nums.length, left = 0, right = 0;
while (right < n) {
if (nums[right] != 0) {
swap(nums, left, right);
// left往后走一步,准备接收下一个非0数
left++;
}
// right无论是否为0都继续往后走
right++;
}
}
public void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
如果right指向的数不是0,就把它交换到left的位置? 假如(比如说开头两个)3、4那不就变成4、3了?非零顺序不就变了?
多想几遍就懂了
left 永远 ≤ right;left 左边,全部是已经处理好、按原顺序的非 0 元素;right 是从左往右扫描。