1. 程式人生 > >【劍指Offer學習】【面試題14 :調整陣列順序使奇數位於偶數前面】

【劍指Offer學習】【面試題14 :調整陣列順序使奇數位於偶數前面】

題目:輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位予陣列的後半部分。

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

因此我們可以維護兩個指標,第一個指標初始化時指向陣列的第一個數字,它只向後移動:第二個指標初始化時指向陣列的最後一個數字, 它只向前移動。在兩個指標相遇之前,第一個指標總是位於第二個指標的前面。如果第一個指標指向的數字是偶數,並且第二個指標指向的數字是奇數,我們就交換這兩個數字。

程式碼實現:

public class Test14 {

    /**
     * 輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,
     * 使得所有奇數位於陣列的前半部分,所有偶數位予陣列的後半部分。
     *
     * @param arr 輸入的陣列
     */
    public static void reorderOddEven(int[] arr) {
        // 對於輸入的陣列為空,或者長度小於2的只接返回
        if (arr == null || arr.length < 2) {
            return
; } // 從左向右記錄偶數的位置 int start = 0; // 從右向左記錄奇數的位置 int end = arr.length - 1; // 開始調整奇數和偶數的位置 while (start < end) { // 找偶數 while (start < end && arr[start] % 2 != 0) { start++; } // 找奇數
while (start < end && arr[end] % 2 == 0) { end--; } // 找到後就將奇數和偶數交換位置 // 對於start=end的情況,交換不會產生什麼影響 // 所以將if判斷省去了 int tmp = arr[start]; arr[start] = arr[end]; arr[end] = tmp; } } /** * 輸出陣列的資訊 * * @param arr 待輸出陣列 */ public static void printArray(int[] arr) { if (arr != null && arr.length > 0) { for (int i : arr) { System.out.print(i + " "); } System.out.println(); } } public static void main(String[] args) { int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; reorderOddEven(array); printArray(array); } }

執行結果:
這裡寫圖片描述