Move Zeroes
题目
Given an array nums
, write a function to move all 0
’s to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12]
, after calling your function, nums should be [1, 3, 12, 0, 0]
.
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
解决
1. 利用vector的函数及性质
当发现0
的时候,利用vector的函数erase()
将0
删除,之后再将0
加进数组中。这样就能不会改变vector中原来非0
的数的顺序。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int num = nums.size();
vector<int>::iterator it = nums.begin();
for (int i = 0; i < num; i++) {
if ((*it) == 0) {
nums.erase(it);
nums.push_back(0);
} else {
it++;
}
}
}
};
2. 将非0
数提前
遍历数组,将每一个非0
数提前,直到前面没有0
为止。同时记录最后一个非0
的数在新数组中的位置index
,从下标为index + 1
添加0
直到index == n
。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int num = nums.size();
int index = 0;
for (int i = 0; i < num; i++) {
if (nums[i] != 0) {
int temp = nums[i];
nums[i] = nums[index];
nums[index++] = temp;
}
}
while (index < num) {
nums[index++] = 0;
}
}
};