笨蛋学算法之LeetCodeHot100_4_移动零(Java)

发布于:2024-06-13 ⋅ 阅读:(141) ⋅ 点赞:(0)

在这里插入图片描述

package com.lsy.leetcodehot100;

public class _Hot4_移动零 {
    public static int[] moveZeroes(int[] nums){
        //判断数组是否为null
        if(nums==null && nums.length==0){
            return null;
        }

        /**
         * 初始化两个指针 i 和 noZero,其中 i 用于遍历数组,noZero 用于记录非零元素的位置。初始时,i = 0 和 noZero = 0。
         *
         * 遍历数组:
         *
         * 当 i = 0 时,nums[0] 是 0,不满足 if(nums[i] != 0) 的条件,所以不做任何操作,i 自增到 1。
         * 当 i = 1 时,nums[1] 是 1,满足条件,执行交换:
         *    将 nums[1](即 1)与 nums[noZero](即 nums[0])交换,得到 nums = [1, 0, 0, 3, 2]。
         *    noZero 自增到 1。
         *    继续遍历,i = 2,nums[2] 是 0,不满足条件,i 自增到 3。
         *    i = 3,nums[3] 是 3,满足条件,执行交换:
         *    将 nums[3](即 3)与 nums[noZero](即 nums[1])交换,得到 nums = [1, 3, 0, 0, 2]。
         *    noZero 自增到 2。
         *    最后,i = 4,nums[4] 是 2,满足条件,执行交换:
         *    将 nums[4](即 2)与 nums[noZero](即 nums[2])交换,得到最终结果 nums = [1, 3, 2, 0, 0]。
         *    noZero 自增到 3,但此时 noZero 已经达到非零元素的最后一个位置,所以 noZero 不再自增。
         * 遍历结束,数组中的非零元素已经全部移动到了数组的左侧,零元素移动到了右侧。
         */
        //将结果集进行划分,左边不为0,右边全为0
        //noZero就是不为0的数字下标
        int noZero=0;
        for(int i=0;i<nums.length;i++){
            //如果不为0,那么就进行交换,将不为0的数字换到数组的左边
            if(nums[i]!=0){
                int temp = nums[i];
                nums[i]=nums[noZero];
                nums[noZero++]=temp;
            }
        }
        return nums;
    }

    public static void main(String[] args) {
        int[] nums = {0,1,0,3,12};
        int[] moveNums = moveZeroes(nums);
        for(int i=0;i<moveNums.length;i++){
            System.out.print(moveNums[i]+"\t");
        }

    }
}