The Problem:
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.
Example:
Input:[0,1,0,3,12]
Output:[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.
The following are my two methods with C language, the commented one is with the help of making a copy of the array.
void moveZeroes(int* nums, int numsSize) {
int i = 0, j;
int k = 0;
int s = 0; //to mark how many zeros have been found, a cumulative number
/* The main idea is calculates the numbers of zeros, and make the non-zeros move that numbers of steps to the left. */
while (i < numsSize) {
k = i;
while (i < numsSize && nums[i] == 0) {
i++;
}
s+= (i - k);
if (s == numsSize) { //in case all are zeros.
break;
}
for (j = i; j < numsSize && (nums[j] != 0); j++) {
nums[j - s] = nums[j];
}
i = j;
}
if (s > 0) { //in case all are zeros
for (i = numsSize - 1; s > 0; s--,i--) {
nums[i] = 0;
}
}
/*
int new[numsSize];
for (i = 0, j = 0; i < numsSize; i++) {
if (nums[i] != 0) {
new[j++] = nums[i];
}
}
while (j < numsSize) {
new[j++] = 0;
}
for (i = 0; i < numsSize; i++) {
nums[i] = new[i];
}
*/
}
Test results
Submission Detail
21 / 21 test cases passed. | Status: Accepted |
Runtime: 4 ms |