题目描述:
解题思路:
第一种方法,统计零的个数,然后重构数组
第二种方法,双指针,其实和第一种方法差不多。
第三种方法,利用快排的思路,遍历一次。
参考代码:
public void moveZeroes(int[] nums) {
int zc=0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]==0)
zc++;
}
int temp=0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]!=0)
nums[temp++]=nums[i];
}
for (int i = nums.length-zc; i < nums.length; i++) {
nums[i]=0;
}
}
//双指针
public void moveZeroes2(int[] nums) {
if(nums==null) {
return;
}
//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//非0元素统计完了,剩下的都是0了
//所以第二次遍历把末尾的元素都赋为0即可
for(int i=j;i<nums.length;++i) {
nums[i] = 0;
}
}
//一次遍历,快排思想
public void moveZeroes3(int[] nums) {
if(nums==null){
return;
}
int j=0;
int temp;
for (int i = 0; i < nums.length; i++) {
if(nums[i]!=0)
{
temp=nums[i];
nums[i]=nums[j];
nums[j++]=temp;
}
}
}