对于力扣数组题移动零的解题思路分享
题目:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解题思路:
1.利用双指针排序思想
当指针指向非零数字时,将该数与指向零的指针交换;
JAVA代码实现
//双指针实现
static void moveZero(int[] nums){
//为空直接退出方法
if(nums==null){
return;
}
//第一个指针(这一个指针的意思是,默认指向第一个数,遍历的时候如果遇到非零数,
//该指针就会移动,直到指向零)
int n = 0;
//循环遍历数组中的每一个数
for(int i=0;i<nums.length;i++){
//当这个数为零时
if(nums[i]!=0){
//定义一个临时变量用以实现交换
int temp = nums[n];
nums[n]=nums[i];
nums[i]=temp;
//跟随非零数移动,直到指向零
n++;
}
}
}
2.思路二:
一个指针p默认指向第一个数,另一个指针遍历数组寻找非零数,找到的时候将该非零数赋值给p,p++
static void moveZero(int[] nums){
if(nums==null){
return;
}
//该指针默认指向第一个数
int p=0;
//遍历寻找非零数然后赋值到前面非零数个数
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
//直接将非零数赋值给第一个数
nums[p] = nums[i];
//p指针移动指向下一个数
p++;
}
}
//再次遍历将后面几个数赋值为零
for(int j=p;j<nums.length;j++){
nums[j]=0;
}
}