题目大意:原地将数组变化成所有零在数组末尾,其余元素保持原顺序
分析:双指针。
方法一(自己的):zero指针指向0,non_zero指针指向zero后的第一个非零,交换两个指针并且双指针后移。循环这个过程。
方法二:题目相当于要把所有非零元素移到数组前面。所以遍历数组,遇到非零元素就赋值给最后一个找到的非零元素的后一位。这样剩余的空位填0即可。
代码:
方法一:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int zero = 0,non_zero = 0;
while(non_zero < nums.size()){
while(zero < nums.size() && nums[zero]) zero++;
non_zero = zero + 1;
while(non_zero < nums.size() && nums[non_zero] == 0) non_zero++;
if(zero < nums.size() && non_zero < nums.size())
swap(nums[zero++],nums[non_zero++]);
}
}
};
//改进版
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int zero = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i]) {
swap(nums[zero++], nums[i]);
}
}
}
};
方法二:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int non_zero = 0;
for(int i = 0;i < nums.size();i++){
if(nums[i]){
nums[non_zero++] = nums[i];
}
}
for(int i = non_zero;i < nums.size();i++){
nums[i] = 0;
}
}
};