方法一:优化双指针法
public class Solution {
public void MoveZeroes(int[] nums) {
int step=0;
int i=0;
int length=nums.Length;
if(length==1) return;
for(;i<length;i++)
{
if(nums[i]==0) step++;
else nums[i-step]=nums[i];
}
for(;step>0;step--)
{
nums[length-step]=0;
}
return ;
}
}
时间77 内存96
方法二 :双指针
public class Solution {
public void MoveZeroes(int[] nums) {
int fastP=0;
int lowP=-1;
int length=nums.Length;
for(;fastP<length;fastP++)
{
if(nums[fastP]!=0)
{
lowP++;
nums[lowP]=nums[fastP];
if(lowP!=fastP) nums[fastP]=0;
}
}
}
}
时间26 内存62
方法三:针对方法一的简化,直接在循环中赋值0,节省第二次的循环
public class Solution {
public void MoveZeroes(int[] nums) {
int left=0;
for(int i=0;i<nums.Length;i++)
{
int temp=nums[i];
if(temp!=0)
{
if(i!=left){
nums[left]=nums[i];
nums[i]=0;
}
left++;
}
}
}
}