8. 移動零
阿新 • • 發佈:2021-06-12
移動零
[原題連結](初級演算法 - 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++; } } } }