Given an array
nums
, write a function to move all0
'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
题意:把数组的零移到末尾,其余元素相对位置不变,不能使用新数组,让操作次数尽可能小。
思路:用到一个队列,从前向后枚举,每当遇到一个零,向队列里添加这个零元素的位置,每当遇到非零元素,看是否队列不为空,不为空的话就取出一个元素,把这个非零元素放在从队列里取出来的对应位置上,然后把这个非零元素的位置加入队列,并把这个位置的元素改为零。
C代码:
void moveZeroes(int* nums, int numsSize) {
int head,tail;
head = tail = 0;
int i,pos[10005];
for(i = 0; i < numsSize; i++) {
if(nums[i] == 0) {
pos[tail++] = i;
}
else if(head <4 tail) {
pos[tail++] = i;
nums[pos[head]] = nums[i];
head++;
nums[i] = 0;
}
}
}
Java代码:
public class Solution {
public void moveZeroes(int[] nums) {
int head,tail,i,len;
int[] queue = new int[20005];
len = nums.length;
head = tail = 0;
for(i = 0; i < len; i++) {
if(nums[i] == 0) {
queue[tail++] = i;
}
else if(head < tail){
queue[tail++] = i;
nums[queue[head]] = nums[i];
head++;
nums[i] = 0;
}
}
}
}