一、暴力解法:循环数组,如果=0则放到最后
class Solution {public void moveZeroes(int[] nums) {int k=0; for(int i=0; i<nums.length-k;){if(nums[i]==0){k++;for(int j=i; j<nums.length-k; j++){ nums[j]=nums[j+1];}nums[nums.length-k]=0;}if(nums[i]!=0){i++;}}}
}
注意:
- 第一个for循环,条件为
nums.length-k
,k为已经发现0的个数,只要将已经找出的0的前面的数 - 第一个for循环,条件为
nums.length-k
,k为已经发现0的个数,后面k个0不用动了 - 考虑存在连续的0,
if(nums[i]!=0){i++;}
,如果移动后的数不为零,则判断后一个(i++)数
二、正确解法:双指针
思路:使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
class Solution {public void moveZeroes(int[] nums) {int n=nums.length, left = 0, right = 0;while(right<n){if(nums[right]!=0){swap(nums,right,left);left++;}right++;}}public void swap(int[] nums, int a, int b){int tmp=nums[a];nums[a]=nums[b];nums[b]=tmp;}
}
注意:
- 只需要动一边即可:致力于将左边都设置为非零数,右边自然会变成零