难度:简单
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数
一开始的想法是计算0的个数,然后往后移动0,但是做了半天没有头绪。转而想到“快慢指针法”,定义两个指针变量,i和j,j变量保存不为0的数字。
class Solution {
public void moveZeroes(int[] nums) {//快慢指针法
int n = nums.length;
int j=0;
for(int i=0;i<n;i++){//i是快指针,j是慢指针
if(nums[i]!=0){
nums[j++] = nums[i];
}
}
for(int m = j; m < n; m++){//补0
nums[m]=0;
}
}
}
代码运行过程:
nums[1,2,0,3,1,0,2]
i = 0 nums[0] = 1
i = 1 nums[1] = 2
i = 2 跳过,不执行
i = 3 nums[2] = 3
i = 4 nums[3] = 1
i = 5 跳过,不执行
i = 6 nums[4] = 2