LeetCode283. 移动零

一、题目描述

二、解法

class Solution {
    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0) return;
        /**
         *  方法1: 双指针,两次遍历  ->  把非0的往前挪,然后补0
         */
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[index++] = nums[i];
            }
        }
        // nums中,[0...index)的位置均为非0元素, nums剩余位置补0
        while (index < nums.length) {
            nums[index++] = 0;
        }
        /**
         *  方法2:双指针,一次遍历,交换
         *        优化1:只当 i 和 index 不相等时才进行交换。应对全非0元素的特殊情况。
         *        优化2:当i > index时,用赋值操作 代替 交换操作
         */
        /*
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
//                swap(nums, i, index);
//                index++;
                // 优化1
                if (i != index) {
//                    swap(nums, i, index);
                    // 优化2
                    nums[index] = nums[i];
                    nums[i] = 0;

                }
                index++;
            }
        }
        */
        /**
         * 方法3:双指针,一次遍历
         *      思路:把 i - j 看作另一个指针,它是指向第一个0的位置
         */
        /*
        int j = 0; // 统计0的个数
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                j++;
            }else if (j != 0) {
                nums[i - j] = nums[i];
                nums[i] = 0;
            }
        }
        */
    }
    private void swap(int[] nums, int a, int b) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}

 

posted @ 2020-12-05 10:39  不学无墅_NKer  阅读(95)  评论(0编辑  收藏  举报