给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
如果要求将数组中的0
全部移动到数组的后面,而无关心非零元素的位置情况,那么我们可以使用荷兰国旗问题的思路求解,代码如下:
class Solution {
public void moveZeroes(int[] nums) {
if(nums == null){
return;
}
int left = 0;
int right = nums.length - 1;
while(left < right){
if(nums[left] == 0){
swap(nums, left, right--);
}
left++;
}
}
public void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
但是题目要求保证非零元素的相对顺序不能发生改变,那么这种方法就无能保证了。我们可以使用快慢指针的思想,将非零元素全部移动到数组的前面,然后将非零元素后面的部分全部置零即可,思路如下:
解题代码如下:
class Solution {
public void moveZeroes(int[] nums) {
if(nums == null){
return;
}
int index = removeZero(nums, 0);
for(int i = index; index < nums.length; index++){
nums[index] = 0;
}
}
public int removeZero(int[] nums, int val){
int slow = 0;
int fast = 0;
while(fast < nums.length){
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
fast++;
}
return slow;
}
}