臺積電擬在南京廠擴產 28nm 至 10 萬片
阿新 • • 發佈:2021-07-27
劍指 Offer 21. 調整陣列順序使奇數位於偶數前面
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。
示例:
輸入:nums = [1,2,3,4]
輸出:[1,3,2,4]
注:[3,1,2,4] 也是正確的答案之一。
提示:
0 <= nums.length <= 50000
1 <= nums[i] <= 10000
做題思路:
這道題算劍指offer裡面理解和做比較簡單,但如何用多種思路做題,也是一種學習的方法。
一、藉助輔助陣列
class Solution { public int[] exchange(int[] nums) { int index = 0; int[] res = new int[nums.length]; //藉助兩個for迴圈,把奇數的數放前面,偶數的數放後面,然後再返回res即可 for (int num : nums) { if (num %2 == 1) res[index++] += num; } for (int num : nums) { if (num % 2 != 1) res[index++] += num; } return res; } }
二、類似於快排或者頭尾雙指標的方法
class Solution { public int[] exchange(int[] nums) { //設定左右指標 int l = 0; int r = nums.length - 1; //在while迴圈裡面,l向右移動指向了奇數,r向左移動指向了偶數,只有當l大於r的時候才結束迴圈。 //當然也會交換l和r所指向的數字 while (l <= r) { if (l <= r && nums[l] % 2 == 1) l++; if (l <= r && nums[r] % 2 == 0) r--; if (l > r) break; int tmp = nums[l]; nums[l] = nums[r]; nums[r] = tmp; } return nums; } }
三、快慢雙指標
這個做題思路借鑑了LeetCode的鬱郁雨。
快慢雙指標:
1、slow和fast都設定在陣列的頭部,而不是像之前一個在頭部,一個在陣列尾部
2、fast如果遇到奇數,則和slow交換,沒有則右移
3、等fast遍歷到末尾結束遍歷
class Solution { public int[] exchange(int[] nums) { int slow = 0, fast = 0; while (fast < nums.length) { if (nums[fast] % 2 == 1) { int tmp = nums[fast]; nums[fast] = nums[slow]; nums[slow] = tmp; slow++; } fast++; } return nums; } }