1.题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

  1. 输入: [0,1,0,3,12]
  2. 输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

2.思路

两次遍历:

  1. public void moveZeroes(int[] nums) {
  2. if(nums==null) {
  3. return;
  4. }
  5. //第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
  6. int j = 0;
  7. for(int i=0;i<nums.length;++i) {
  8. if(nums[i]!=0) {
  9. nums[j++] = nums[i];
  10. }
  11. }
  12. //非0元素统计完了,剩下的都是0了
  13. //所以第二次遍历把末尾的元素都赋为0即可
  14. for(int i=j;i<nums.length;++i) {
  15. nums[i] = 0;
  16. }
  17. }

一次遍历(双指针):

  1. public void moveZeroes(int[] nums) {
  2. if(nums==null) {
  3. return;
  4. }
  5. //两个指针i和j
  6. int j = 0;
  7. for(int i=0;i<nums.length;i++) {
  8. //当前元素!=0,就把其交换到左边,等于0的交换到右边
  9. if(nums[i]!=0) {
  10. int tmp = nums[i];
  11. nums[i] = nums[j];
  12. nums[j++] = tmp;
  13. }
  14. }
  15. }