LeetCode第283题 移动零



问题描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。



解题思路:

  解法一:使用冒泡排序的方法将所有0移动到后面。
&emps; 解法二:遍历两次数组,第一次先将所有的非零数移动到前面,即先前靠拢;第二次遍历将数组末尾多余出来的位置赋值为零。



代码实现:

    /**
     * 冒泡排序解法
     * @param nums
     */
    public static void moveZeroes(int[] nums) {
    
    
        int j = nums.length - 2;
        //从后向前遍历,寻找0
        while(j>=0){
    
    
            if(nums[j]==0){
    
    
                //找到零后使用类似于冒泡排序的方法将零移动到最后、
                int i=j;
                //注意 i<nums.length-2 要放在前面,防止数组越界
                while (i<=nums.length-2 && nums[i+1] != 0) {
    
    
                    int t = nums[i];
                    nums[i] = nums[i+1];
                    nums[i+1] = t;
                    i++;
                }
            }
            j--;
        }
    }


    /**
     * 两次遍历的解法
     * @param nums
     */
    public static void moveZeroes2(int[] nums) {
    
    
        int j = 0;  //用于记录非零结尾位置,即临界值
        //第一次遍历将所有的非零值都移动到前面
        for(int i=0; i<nums.length; i++){
    
    
            if(nums[i] !=0 ){
    
    
                nums[j] = nums[i];
                j++;
            }
        }

        //第二次遍历将将末尾多出的位置都赋值为零
        for(int i=j; i<nums.length; i++){
    
    
            nums[i] = 0;
        }
    }

冒泡排序解法的提交结果:
在这里插入图片描述

两次遍历解法的提交结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/113794275
今日推荐