283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。

示例1

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例2

输入: nums = [0]
输出: [0]

分析

题目是要在原地将所有0移动到数组的末尾。首先要知道,怎么确定0的位置以及个数。
如果说通过遍历去确定0的位置以及个数的话,那么在找0的过程中,是不是就可以同时移动他们,那么就需要两个标志位,一个负责找零,一个负责移动。

实现

  1. 使用双指针遍历的同时交换元素
    class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0,fast = -1;
        while(++fast<nums.length)
            if(nums[fast]!=0)
                swap(nums,fast,slow++);
    }
    public void swap(int[] nums,int l,int r){
        if(nums[l]==nums[r]) return;
        nums[l]^=nums[r];
        nums[r]^=nums[l];
        nums[l]^=nums[r];
    }
    }
  2. 第一次遍历既然可以知道0的个数,那么当fast指针走到头的时候,fast-slow就是0的个数,直接补0即可
    class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0,fast = -1;
        while(++fast<nums.length)
            if(nums[fast]!=0)
                nums[slow++] = nums[fast];
        while(slow<fast)
            nums[slow++] = 0;
    }
    }

每个不起眼的日子,都是反败为胜的资本