面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面

android阿杜發表於2018-07-15
將一個整數陣列中的所有奇數放到偶數前面
如:
原始陣列:{5,8,3,4,1,7,9,2,6,120}
最終結果:{5,3,1,7,9,2,4,6,120,8}


面試時面試官說出題目後,加了一句,需要最優時間複雜度。
我當時就有點懵,對時間複雜度不瞭解,於是第一想法就排除了雙重迴圈,然後就想不出更好的解決辦法了。


仔細分析這個題目:
尋找陣列前面所有的偶數(能被2整除的數),放到陣列後面;
尋找陣列後面所有的奇數(不能被2整除的數),放到陣列前面;
是不是從陣列開頭位置啟動一個迴圈,每當遇到一個偶數時,再從陣列末尾位置啟動一個迴圈,尋找一個奇數,找到後調換兩者的位置。
當兩層迴圈的變數在k點相遇時,就證明:
陣列k位置之前所有的數字都是奇數,陣列k位置之後的所有數字都是偶數。


對我當時就是這個思路,逃不開雙重迴圈。

有了思路,擼起程式碼就簡單了,直接上程式碼吧,有註釋:

public class Test {
    public static void main(String[] args) {
        int[] arr = {7, 8, 1, 4, 2, 5, 3, 10, 6, 13};
        changeOddNumberAhead(arr);
        print(arr);
    }

    /**
     * change odd numbers to head of even numbers
     *
     * @param numArr
     */
    private static void changeOddNumberAhead(int[] numArr) {
        if (numArr == null || numArr.length <= 1) {
            //陣列為null,或者長度 <= 1,都不需要處理。
            return;
        }
        //內層迴圈的變數,預設等於陣列的最後位置
        int innerIndex = numArr.length - 1;
        //臨時變數
        int temp;
        //開始迴圈整個陣列,尋找偶數
        for (int i = 0; i < numArr.length; i++) {
            //迴圈停止條件
            if (i >= innerIndex) {
                //已經處理完畢了,返回
                return;
            }
            if (numArr[i] % 2 != 0) {
                //找到的是奇數
                continue;
            }
            for (; innerIndex >= 0; innerIndex--) {
                //迴圈停止條件
                if (i >= innerIndex) {
                    //已經處理完畢了,返回
                    //內層迴圈也需要判斷條件,不能迴圈到陣列開頭位置
                    return;
                }
                if (numArr[innerIndex] % 2 == 0) {
                    //找到的是偶數
                    continue;
                }
                //交換陣列元素
                temp = numArr[innerIndex];
                numArr[innerIndex] = numArr[i];
                numArr[i] = temp;
                //每當成功調換一對元素後,需要break內層迴圈
                //重新執行外層迴圈,尋找下一個偶數
                //不要忘記這兒的break
                break;
            }
        }
    }

    private static void print(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        StringBuilder stringBuffer = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            stringBuffer.append(arr[i]);
            if (i != arr.length - 1) {
                stringBuffer.append(", ");
            }
        }
        System.out.println(stringBuffer.toString());
    }
}



相關文章