1. 程式人生 > 其它 >8. 移動零

8. 移動零

移動零

[原題連結](初級演算法 - LeetBook - 力扣(LeetCode)全球極客摯愛的技術成長平臺 (leetcode-cn.com))

/**
 * 給定一個數組 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。
 * 必須在原陣列上操作,不能拷貝額外的陣列。
 * 儘量減少操作次數。
 */
public class Solution {
    /**
     * 法一:冒泡
     * @param nums
     */
    public void moveZeroes1(int[] nums) {
        for (int i = 0, j = nums.length - 1; i < j; ) {
            if (nums[i] == 0) bubbling(nums, i, j--);
            else i++;
        }
    }

    private void bubbling(int[] nums, int index, int des){
        if (index == des) return;
        int temp;
        for (int i = index; i < des; i++) {
            temp = nums[i];
            nums[i] = nums[i + 1];
            nums[i + 1] = temp;
        }
    }

    /**
     * 法二
     * 思路:冒泡法改進,每次冒泡忽略0
     */
    public void moveZeroes2(int[] nums) {
        int temp;
        for (int i = 0, j = i; i < nums.length - 1; j = ++i) {
            while (nums[j] == 0){
                if (++j == nums.length) return;
            }
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }

    /**
     * 法三:
     * 思路:從陣列末端順序找0,
     * 找到則將0後的元素前移一位,並在陣列最後補0
     * 時間複雜度O(n^2)
     * @param nums
     */
    public void moveZeroes3(int[] nums) {
        if (nums.length == 1) return;
        for (int i = nums.length - 1; i >= 0; i--) {
            //找到0
            if (nums[i] == 0) {
                //i後的元素前移
                for (int j = i; j < nums.length - 1; j++) {
                    nums[j] = nums[j + 1];
                }
                //補0
                nums[nums.length - 1] = 0;
            }
        }
    }

    /**
     * 法四:
     * 思路:用i、j遍歷陣列,i遇0則停
     * 每當j遇到非0值,則j所在的元素(非0值)與i所在的元素(0)交換,
     * 這樣i就可以++了,迴圈這個過程,直到j“通過”陣列,i必定到達了它所能到達的
     * 最遠的位置,i所到達的位置元素便非0了,且相對順序不變。
     * 這樣陣列的0值便移動到了陣列末尾。
     * 時間複雜度O(n)
     * @param nums
     */
    public void moveZeroes4(int[] nums){
        //遇0則停
        int i = 0;
        int temp;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] != 0) {
                temp = nums[j];
                nums[j] = nums[i];
                nums[i] = temp;
                i++;
            }
        }
    }
}