調整數組順序使奇數位於偶數前面

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

這個題,有兩種考慮方法,一種是空間換時間,一種是時間換空間。

方法一:
空間換時間。思路是,遍歷原數組,遇到是奇數的就加入到新的數組中,並且要設置一個標誌位一直指向新數組中待插入的那一位。然後,再次遍歷數組,遇到偶數就加入到新數組,並且將標誌位向後移動一位,指向待插入的位置。最後,將新數組賦值給原數組。
綜上分析,代碼如下:

public class Solution {
    public void reOrderArray(int [] array) {
        if(array.length == 0){
            return;
        }
        int [] result = new int[array.length];
        int index = 0;

        for(int i = 0;i < array.length;i++){
            if(array[i] % 2 == 1){
                result[index] = array[i];
                index++;
            }        
        }

        for(int i = 0;i < array.length;i++){
            if(array[i] % 2 == 0){
                result[index] = array[i];
                index++;
            }        
        }

        //array = result;
        for(int i = 0;i < array.length;i++){
            array[i] = result[i];
        }
    }
}

這裏,有個需要注意的地方,就是最後將排好的數組賦值給原數組時,我直接使用了array = result; 測試結果是不通過,因爲我只做iOS的,在iOS中,這樣的語句是讓array指向result指向的內存。所以,我去查了Java的數組賦值,也問了學Java的同學。Java中這句話的意思也是讓array指向result指向的內存,array原來指向的內存將無法訪問。按理說,這時候無論array、result誰對數組進行操作,數組都會改變。但是牛客網上的測試就是不通過,後來在eclipse中手動測,又可以通過,不知道是什麼原因。有知道的還請告知。
這個方法的循環次數是2n,時間複雜度是n,空間複雜度是n。

方法二
時間換空間。簡單的說就是不開闢新的空間,直接在原數組上進行更多的移動操作。
分析:用一個指針指向數組第一個數,並依次與後一個數進行比較,加入第一個數是偶數,第二個數是奇數,就進行交換。這樣一趟下來,相鄰的兩個數的前後位置就確定了。那麼再次進行遍歷,交換相鄰兩個奇數和偶數。這個時候,要注意第二次循環的跳出條件,因爲最後一個數在上一次遍歷的時候已經確定了,多以不用比較最後一個數,具體爲array.length - 1 -i
綜上分析,代碼如下:

public class Solution {
    public void reOrderArray(int [] array) {
        if(array.length == 0){
            return;
        }
        for(int i = 0;i < array.length - 1;i++){
            for(int j =0; j < array.length - 1 -i;j++){
                if(array[j] % 2 == 0 && array[j + 1] % 2 == 1){
                    int temp = array[j+1];
                    array[j+1] = array[j];
                    array[j] = temp; 
                }
            }
        }
    }
}
發佈了42 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章