283. 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.
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.
解题思路:
题目要求把所有的0调到数组的末尾,并且要求进行最少的操作,也就是说要求改变最少次数数组的值。当一个数前面有n个0,那么这个数前面的第n个数的值赋值为这个数,依次类推。从数组的最后一个数开始计算,一直到非0的第一个数,从这个非零的数开始将数组的值赋值为0.
在代码中的最后两个for循环,为什么注释掉的那部分会陷入死循环?明明都是用的一样的数啊,不懂~
代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int numberOf0=0;
for(int i=0; i<nums.size(); i++) {
if(nums[i]==0) {
numberOf0++;
}
else {
nums[i-numberOf0]=nums[i];
}
}
int end0=0;
for(int i=nums.size()-1; i<=0; i++) {
if(nums[i]==0) {
end0++;
}
else break;
}
int start=nums.size()-end0-1;
int end=nums.size()-numberOf0;
// for(int i=(nums.size()-end0-1); i>=(nums.size()-numberOf0); i--) {
// nums[i] = 0;
// printf("ok\n");
// }
for(int i=start; i>=end; i--) {
nums[i]=0;
}
}
};