Skip to content

双指针, 这里比较subtle的写法是, 在碰到非0元素的时候, 发生交换, 并且left才向前移动, 发生交换的时机总是在非0元素上, 并且这个时候right在0区间的后面的第一个元素, left总在0区间的开头, 交换让整个0区间向后移动了一格

java
class Solution {
    /**
     * 双指针, 这里比较subtle的写法是,
     * 在碰到非0元素的时候, 发生交换, 并且left才向前移动,
     * 发生交换的时机总是在非0元素上,
     * 并且这个时候right在0区间的后面的第一个元素, left总在0区间的开头, 
     * 交换让整个0区间向后移动了一格
     */
    public void moveZeroes(int[] nums) {
        int i0 = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                swap(nums, i0, i);
                i0++;
            }
        }
    }

    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

Personal Knowledge Base