🔗链接
- 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
进阶:你能尽量减少完成的操作次数吗?
解题思路
运用快慢指针的思路。num_p作为快指针,指向是未经处理过的第一个非零数字;zero_p作为慢指针,指向的是未经处理过的第一个零的位置并且不大于num_p指针;
当慢指针指向0并且快指针指向数字的时候进行调换,这时候可以保证非零数字顺序不会发生改变。
针对指针细节处理,快指针在比慢指针位置相同或小的时候快指针要向前移动。
代码
class Solution {
public static void moveZeroes(int[] nums) {
int zero_p = 0, num_p = 0;
while(num_p < nums.length && zero_p<nums.length) {
if(nums[zero_p] == 0 && nums[num_p] != 0) {
int temp = nums[num_p];
nums[num_p] = nums[zero_p];
nums[zero_p] = temp;
}
if(nums[zero_p] != 0 && num_p > zero_p) zero_p++;
if(nums[num_p] == 0 || num_p <= zero_p) num_p++;
}
}
}