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.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
解题思路:将零在不改变顺序的前提下移到最右边,思路一、把非零元素前移,思路二、将零后移
思路一、把非零元素前移
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j=0,i=0;
for( i;i<nums.size();i++){
if(nums[i]){
swap(nums[i],nums[j++]);
}
}
}
};
思路二、将零后移
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j=0,i=0;
while(i!=nums.size() - j) {
if (nums[i] == 0) {
for (int k = i; k<nums.size() - j -1; k++) {
swap(nums[k], nums[k + 1]);
}
j++;
i = 0;
}
else i++;
}
}
};
解题出现的问题:后移时,
int j=0,i=0;
int ans;
for( i;i<nums.size()-j;i++){
if(nums[i]==0){
for(int k=i;k<nums.size()-j-1;k++){
swap(nums[k],nums[k+1]);
}
j++;
i=0;
}
}
想将for循环的循环变量重新赋值,但是是不能对i重新赋值,对i的值不能重复赋值,导致错误