移動零(Java的2種算法實現)

移動零


題目

移動零(力扣:283)

給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。

說明:

必須在原數組上操作,不能拷貝額外的數組。
儘量減少操作次數。

分析

使用雙指針解決。

方法一:用2個指針i指向當前遍歷的節點,j指向已排好序的當前非零節點的後一位。i指針位置的當前節點,如果是非零,則交換i和j的位置。

方法二:第一次遍歷將非零節點都移動到數組的前面,並計算出非零節點的數量s,完成遍歷後,第二次遍歷從s開始一直到數組末尾,設置爲0即可。

代碼實現:方法一

    /**
     * 283. 移動零
     * @param nums
     */
    public void moveZeroes(int[] nums) {
        if (nums == null){
            return;
        }
        int i = 0, j = 0;
        int tmp;
        while (i <nums.length){
            if (nums[i] != 0){
                tmp = nums[j];
                nums[j] = nums[i];
                nums[i] = tmp;
                j++;
            }
            i++;
        }
    }

代碼實現:方法二

    /**
     * 283. 移動零
     *
     * @param nums
     */
    public void moveZeroes2(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return;
        }
        int s = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[s] = nums[i];
                s++;
            }
        }
        for (int i = s; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章