劍指Offer:面試題14——調整數組順序使奇數位於偶數前面(java實現)

問題描述

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

思路:

1.最簡單的想法,不考慮時間複雜度,掃描數組,遇到偶數,先取出這個數,然後把它後面的數字都往前面移動一位,這樣最後空出一位放該偶數即可。但顯然這樣會重複移動很多次。時間複雜的O(n^2)
2.在前後安排兩個哨兵i,j,前面的用來指示偶數(即掃描如果是奇數就往後走),後面的用來指示奇數(遇到偶數就往前面走),當i掃描到偶數而j掃描到奇數時,我們就將其交換。類似掃描下去直到i,j相遇。但是該方法會改變原始元素的相對位置。
3.(具有可擴展性的解法)
如果題目改成:把數組中的數按照大小分爲兩部分,所有負數都在非負數的前面,該怎麼做?當然我們改變2中的判斷條件即可。那麼是否可以用一種可擴展 的方法能解決這一類問題呢?
當然可以。我們只要把判斷部分換成一個通用的函數即可。(具體參考劍指Offer——105頁)

思路1代碼:

    public void reOrderArray(int [] array) {
        if(array == null || array.length == 0){
            return;
        }

        int n = array.length;
        int count = 0;

        for(int i = 0; i < n && count < n; i++){
            count++;
            int a = array[i];
            if(a % 2 == 0){
                for(int j = i; j < n-1; j++){
                    array[j] = array[j+1];
                }

                array[n-1] = a;
                i--;

            }
        }
    }

思路2代碼:

//未考慮元素的相對位置不變
public void reOrderArray(int [] array) {
        if(array == null || array.length == 0){
            return;
        }

        int i = 0;
        int j = array.length - 1;

        while(i<j){
            while(i<j && array[i]%2 != 0){
                i++;
            }

            while(i<j && array[j]%2 == 0){
                j--;
            }

            if(i < j){
                int tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }

現在我們要針對思路2來考慮下:如果我們要求不能改變原始數組中元素的相對位置(奇數與奇數的相對位置,偶數與偶數的),該怎麼做?(暫時還沒想到好的方法)

發佈了62 篇原創文章 · 獲贊 44 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章