1. 程式人生 > 資訊 >臺積電擬在南京廠擴產 28nm 至 10 萬片

臺積電擬在南京廠擴產 28nm 至 10 萬片

劍指 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;
        }
    }