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.
#include <vector>
#include <iostream>
using namespace std;
// if we dont care about the order.
void moveZeros(vector<int>& nums) {
if(nums.size() == 0) return;
int i = 0;
int j = nums.size() - 1;
while(i < j) {
if(nums[i] == 0) {
swap(nums[i], nums[j]);
j--;
} else {
i++;
}
}
}
// if we want to keep the order.
void moveZerosII(vector<int>& nums) {
if(nums.size() <= 1) return;
int i = 0, j = 0;
while(j < nums.size()) {
if(nums[j] != 0) {
nums[i++] = nums[j++];
} else {
j++;
}
}
while(i < nums.size()) {
nums[i++] = 0;
}
}
int main(void) {
vector<int> nums;
nums.push_back(0);
nums.push_back(1);
nums.push_back(0);
nums.push_back(3);
nums.push_back(12);
<pre name="code" class="cpp"> // moveZeros(nums);
moveZerosII(nums); for(int i = 0; i < nums.size(); ++i) { cout << nums[i] << endl; } cout << endl;}