题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
示例
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
思路
使用双指针,快慢指针
- slow = 0,fast = 1
- 遍历数组
- slow和fast的元素值的情况共有四种
(1)nums[slow] == 0 && nums[fast] == 0,慢指针slow不变,继续循环
(2)nums[slow] == 0 && nums[fast] != 0,nums[slow]和nums[fast]交换,慢指针slow加1
(3)nums[slow] != 0 && nums[fast] == 0,慢指针slow加1,继续循环
(4)nums[slow] != 0 && nums[fast] != 0,慢指针slow加1,继续循环
代码
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length;
if (n < 2)
return;
int slow = 0;
for (int fast = 1; fast < nums.length; fast++) {
if (nums[slow] == 0 && nums[fast] == 0)
continue;
if (nums[slow] == 0 && nums[fast] != 0) {
nums[slow] = nums[fast];
nums[fast] = 0;
}
slow++;
/*if (nums[slow] == 0 && nums[fast] == 0) {
continue;
}else if () {
nums[slow] = nums[fast];
nums[fast] = 0;
slow++;
}else if (nums[slow] != 0 && nums[fast] == 0) {
slow++;
}else if (nums[slow] != 0 && nums[fast] != 0) {
slow++;
}*/
}
}
}