题目
方法一 双指针法
使用双指针,左指针指向已处理序列尾部,右指针指向未处理指针头部,当右指针指向非零数时,左右指针移动,当它指向0时,右指针动左指针不动
1.序列没有0,左右指针原地不动
2.序列有0,右指针先走一步,此时左指针对应的就是0,所以要交换
因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
//left指向处理好的序列尾部 right指向未处理的头部
int n = nums.size(), left = 0, right = 0;
while(right < n){
if(nums[right] != 0){
swap(nums[left],nums[right]);
left++;
}
right++;
}
}
};
方法二 覆盖法
指针保存相对位置,覆盖值,最后加0
class Solution {
public void moveZeroes(int[] nums) {
int index = 0;
for(int i=0; i < nums.length; i++){
if(nums[i]!=0){
nums[index]=nums[i];
index++;
}
}
for(int i=index;i<nums.length;i++){
nums[i]=0;
}
}
}