LeetCode——283. 移动零

题目描述:

在这里插入图片描述

解题思路:

第一种方法,统计零的个数,然后重构数组
第二种方法,双指针,其实和第一种方法差不多。
第三种方法,利用快排的思路,遍历一次。
参考代码:

    public void moveZeroes(int[] nums) {
    
    
        int zc=0;
        for (int i = 0; i < nums.length; i++) {
    
    
            if(nums[i]==0)
            zc++;
        }
        int temp=0;
        for (int i = 0; i < nums.length; i++) {
    
    
            if(nums[i]!=0)
                nums[temp++]=nums[i];
        }
        for (int i = nums.length-zc; i < nums.length; i++) {
    
    
            nums[i]=0;
        }

    }

    //双指针
    public void moveZeroes2(int[] nums) {
    
    
        if(nums==null) {
    
    
            return;
        }
        //第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
        int j = 0;
        for(int i=0;i<nums.length;++i) {
    
    
            if(nums[i]!=0) {
    
    
                nums[j++] = nums[i];
            }
        }
        //非0元素统计完了,剩下的都是0了
        //所以第二次遍历把末尾的元素都赋为0即可
        for(int i=j;i<nums.length;++i) {
    
    
            nums[i] = 0;
        }
    }

    //一次遍历,快排思想
    public void moveZeroes3(int[] nums) {
    
    
        if(nums==null){
    
    
            return;
        }
        int j=0;
        int temp;
        for (int i = 0; i < nums.length; i++) {
    
    
            if(nums[i]!=0)
            {
    
    
                temp=nums[i];
                nums[i]=nums[j];
                nums[j++]=temp;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_44900959/article/details/109805683