场景:
刷力扣题,简单题
问题描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解法一:
基于交换排序的思想,如果前一个元素为0就与后一个元素交换
public static void moveZeroes(int[] nums) {
for(int i=0;i<nums.length;i++) {
for(int j=i+1;j<nums.length;j++) {
if(nums[i]==0) {
int temp=nums[j];
nums[j]=nums[i];
nums[i]=temp;
}
}
}
}
运行结果:
解法二:
把非0的往前挪把非0的值往前挪,挪完之后,后面的都应该是0了,然后在用0覆盖后面的,参考大佬的。
public static void moveZeroes2(int[] nums) {
if(nums==null||nums.length==0) return;
int index=0;
for(int i=0;i<nums.length;i++) {
if(nums[i]!=0) {
nums[index++]=nums[i];
}
}
while(index<nums.length) {
nums[index]=0;
index++;
}
}
运行效果:
解法三:
双指针的解法:有点快速排序的那味j用来记录非零的元素
i遍历
如果i(值)不为零,就与j交换(值); j++
如果 i为0 继续遍历
public static void moveZeroes3(int[] nums) {
if(nums==null||nums.length==0) return;
int j=0;
for(int i=0;i<nums.length;i++) {
if(nums[i]!=0) {
int temp=nums[i];
nums[i]=nums[j];//j的值给i
nums[j++]=temp;//i的值给j j索引++
}
}
}
运行效果: