劍指offer面試題14 調整陣列順序使奇數位於偶數前面

頭像是我偶像發表於2017-06-30

一、題目

輸入一個整數陣列,實現一個函式來調整該陣列中陣列的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。要求時間複雜度為O(n)。

二、思考與分析

題目要求把奇數放在陣列的前半部分,偶數放在陣列的後半部分,因此所有的奇數應該位於偶數的前面。也就是掃描陣列的時候,如果發現有偶數出現在奇數的前面,就交換它們的順序,交換之後就符合要求了。

另外要求時間複雜度為O(n),因此我們可以維護兩個指標,第一個指標初始化時指向陣列的第一個數字,遇到奇數,它就向後移動;第二個指標初始化時指向陣列的最後一個數字,遇到偶數,它就向前移動。在兩個指標相遇之前,第一個指標總是位於第二個指標的前面。如果第一個指標指向的數字是偶數,並且第二個指標指向的數字是奇數,我們就交換這兩個數字。

三、程式碼實現

public class Test14 {
    //將奇數放在陣列的前半部分,偶數放在陣列的後半部分
    public static void ReorderOddEvent(int[] array) {
        if (array == null) {
            return;
        }
        int begin = 0;
        int end = array.length - 1;
        while (begin < end) {
            while (begin < end && (array[begin] & 0x1) != 0) {
                begin++;
            }
            while (begin < end && (array[end] & 0x1) == 0) {
                end--;
            }
            if (begin < end) {
                int temp = array[begin];
                array[begin] = array[end];
                array[end] = temp;
            }
        }
    }

    public static void display(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + ",");
        }
    }

    public static void main(String[] args) {
        int[] array = { 1, 2, 3, 4, 5 ,6,7};
        ReorderOddEvent(array);
        display(array);
    }
}

四、結果

1,7,3,5,4,6,2,

五、本題擴充套件

5.1 擴充套件題目

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

5.2 題目分析

需要保證陣列中奇數都出現在前半部分,偶數都出現在後半部分,還要保證奇數和奇數,偶數和偶數之間的相對位置不變,即原來在前面的奇數依然出現在陣列的前面。

要想保證O(n)的時間複雜度,可以犧牲空間來換取。
1. 依然使用兩個指標,第一個指標初始化時指向陣列的第一個數字,它只會向後移動;第二個指標初始化時指向陣列的最後一個數字,它只會向前移動。
2. 另外建立一個陣列,並建立兩個指標,一個奇數指標下標為0,一個偶數指標為陣列最後一個下標(陣列長度-1)分別記錄奇數和偶數的位置。
3. 當第一個指標指向的數字為奇數時,就將該數字存入到新建陣列奇數指標的位置,並將奇數指標的值加1;當第二個指標指向的數字為偶數時,就將該數字存入到新建陣列偶數指標的位置,並將偶數指標減1。
4. 直到陣列被掃描完一遍,奇數和偶數也都重新調整位置完畢。

5.3 程式碼實現

public class Test14 {
    //將奇數放在陣列的前半部分,偶數放在陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變
    public static void reOrderByOrder(int[] array){
        if (array == null) {
            return;
        }
        int len = array.length;
        int[] arr = new int[len];
        int begin = 0;
        int end = len-1;
        for (int i = 0; i < array.length; i++) {
            arr[i] = array[i];
        }
        for (int i = 0; i < arr.length; i++) {
            if((arr[i]&0x1)!=0){
                array[begin++] = arr[i];
            }
            if((arr[len-i-1]&0x1)==0){
                array[end--] = arr[len-i-1];
            }
        }

    }

    public static void display(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + ",");
        }
    }

    public static void main(String[] args) {
        int[] array = { 1, 2, 3, 4, 5 ,6,7};
        //ReorderOddEvent(array);
        reOrderByOrder(array);
        display(array);
    }
}

5.4 結果展示

1,3,5,7,2,4,6,

相關文章