#include<vector>
using namespace std;
//方法一:常规移位法,时间复杂度最长
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int Size = nums.size();
if (Size == 0 || Size == 1) return;
for (int i = 0; i < Size; i++) {
if (nums[i] == 0) {
for (int j = i; j < Size - 1; j++) {
nums[j] = nums[j + 1];
}
Size -= 1;
i -= 1;
}
}
for (int i = Size; i < nums.size(); i++) {
nums[i] = 0;
}
return;
}
};
//方法二:网友答案,两次遍历,直接赋值法,速度最快,效率最高,操作数最少
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int lastNonZeroFoundAt = 0;
// If the current element is not 0, then we need to
// append it just in front of last non 0 element we found.
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != 0) {
nums[lastNonZeroFoundAt++] = nums[i];
}
}
// After we have finished processing new elements,
// all the non-zero elements are already at beginning of array.
// We just need to fill remaining array with 0's.
for (int i = lastNonZeroFoundAt; i < nums.size(); i++) {
nums[i] = 0;
}
}
};
//方法三:熟练运用STL vector方法的调用,这个地方resize由于重新分配的空间和原来的大小相同,所以没有改变原空间地址,原来数据还在,但如果重新分配的空间比原来大,更改了
//原空间地址后,就需要自己手动赋值原数据
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int l = nums.size();
nums.erase((remove(nums.begin(), nums.end(), 0)), nums.end());
nums.resize(l);
}
};