1 题目
LeetCode
给定一个数组nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序
2 解
2.1 插入排序
可以使用修改的插入排序完成,此时的条件变成遇到 0 则交换,没遇到则不交换。
public void moveZeroes(int[] nums) {
if(nums==null||nums.length==0)
return;
//保持非零元素的相对顺序 --> 保证稳定性 冒泡、插入、归并
//插入排序
for(int i=0;i<nums.length;i++){
if(nums[i]==0)
//为0必定在最右侧,不进行排序,
continue;
int j=i;
while(j>0){
if(nums[j-1]==0){
//前一位等于0,交换
swap(nums,j,j-1);
}else{
//不大于或者不等于0,跳出
break;
}
//移动j
j--;
}
}
}
public void swap(int[]arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
2.2 官解
维持快慢指针,一开始两个指针停在0处,快指针遇到非0的数字时停下,与慢指针交换值,交换后两者都前进一步,当快指针走完时,移动就结束了。
public void moveZeroes(int[] nums) {
if(nums==null||nums.length==0)
return;
//维持快慢指针,两个指针停在0处,快指针遇到非0时停下,与慢指针交换值,交换后两者都前进一步
//当快指针遍历结束时结束
int slow=0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=0){
swap(nums,fast,slow);
//此处fast不能++,因为外面的for循环会接着移动fast
slow++;
}
}
}
题目简单的时候,就要保持细心。