283. 移动零

173 阅读1分钟

方法1

先把非零元素提到前面来,后面填充0

class Solution {
    public void moveZeroes(int[] nums) {
        int j = 0;//j为下一个放置非零数字的位置
        //第一次遍历,把非零元素提到前面来
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[j] = nums[i];
                j++;
            }
        }
        //剩余空位补0
        for (int i = j; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
}

方法二

双指针,交换0与非零元素

class Solution {
    public void moveZeroes(int[] nums) {
        int j = 0; // j表示存放下个非零元素的位置
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                swap(nums, i, j);
                j++;
            }
        }
    }
    
    public void swap(int[] nums, int m, int n) {
        int tmp = nums[m];
        nums[m] = nums[n];
        nums[n] = tmp;
    }
}