283. Move Zeroes
题目描述
将数组中的0移动到数组末端,其他数保持原来的顺序往前挪
思路
遍历数组,记录0的位置,0的个数,用非0的数占0的坑。再从右向左遍历按0的个数填0。
官方解法
双指针
最优解
最优解的做法是每次都交换0和非0
void moveZeroes(vector<int>& nums) {
for (int lastNonZeroFoundAt = 0, cur = 0; cur < nums.size(); cur++) {
if (nums[cur] != 0) {
swap(nums[lastNonZeroFoundAt++], nums[cur]);
}
}
}
改进
测试的时候需要多多考虑边界
未考虑[0]
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int i=0,j=-1,num=0;
for(;i<nums.size();i++){
if(nums[i]==0){
num++;
if(j<0)
j=i;
}
else if(j!=i&&j>=0){
nums[j]=nums[i];
j++;
}
}
int z=nums.size()-1;
for(int w=0;w<num;w++){
nums[z]=0;
z--;
}
}
};