方法1:加一个数组——以空间换时间
class Solution {
public void moveZeroes(int[] nums) {
// 1.将结果放入新数组res
int len=nums.length;
int[] res=new int[len];
int i=0;
int j=len-1;
int pos=0;
while(i<=j){
if(nums[pos]==0) res[j--]=0;
else res[i++]=nums[pos];
pos++;
}
System.arraycopy(res,0,nums,0,len);
// nums=Arrays.copyOf(res,len);//在编译器输出nums值以及改变,但在平台上nums没有被res赋值
}
}
方法2:这个方法有点傻,其实遇到0,其后的所有值不用全都挪动的
class Solution {
public void moveZeroes(int[] nums) {
// 2.遇到零则直接移动,最后结尾空位0值填充
int len=nums.length;
int count=0;
int i=0;
while(i<len-count){
while(nums[i]==0 &&i<len-count){ // i后的数字往前移动一位,第3种方法是不移动,直接覆盖,反正后面也要补0的
for(int j=i+1;j<len;j++)
nums[j-1]=nums[j];
count++;
}
i++;
}
for(int j=len-count;j<len;j++)
nums[j]=0;
}
}
方法3:双指针(遍历两次)
两次遍历:遇到0,直接覆盖;然后在数组末尾补0
class Solution {
public void moveZeroes(int[] nums) {
// 3.双指针(两次遍历),遇到0,直接覆盖;然后在数组末尾补0
int len=nums.length;
int j=0;
for(int i=0;i<len;i++){
if(nums[i]!=0)
nums[j++]=nums[i]; // j指针指向零元素下标
}
for(int i=j;i<len;i++){
nums[i]=0;
}
}
}
方法4:双指针(单次遍历)
0值和非0值作替换
class Solution {
public void moveZeroes(int[] nums) {
// 4.双指针(单次遍历),0值和非0值作替换
int len=nums.length;
int j=0;
int tmp;
for(int i=0;i<len;i++){
if(nums[i]!=0){
tmp=nums[j];
nums[j++]=nums[i];
nums[i]=tmp;
}
}
}
}