劍指Offer----調整數組順序使奇數位於偶數前面

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

解析:如果僅考慮奇數放在偶數前面,不考慮奇數和奇數,偶數和偶數之間的相對位置不變的話,可以用以下代碼:

public class Solution {
    public void reOrderArray(int [] array) {
        int length=array.length;
        if(array==null||length<=0)return;
        int pBegin=0;
        int pEnd=length-1;
        while(pBegin<pEnd){
            while(pBegin<pEnd&&(array[pBegin]&1)==1)
                pBegin++;
            while(pBegin<pEnd&&(array[pEnd]&1)==0)
                pEnd--;
            if(pBegin<pEnd){
                int temp=array[pBegin];
                array[pBegin]=array[pEnd];
                array[pEnd]=temp;
            }
        }
    }
}

正確解法:如果考慮奇數和奇數,偶數和偶數相對位置的話,首先新建一個等長數組,設置兩個指針,奇數指針從0開始,偶數指針從奇數個數的末尾 開始,遍歷,時間複雜度爲O(n),空間複雜度爲O(n),代碼如下:

public class Solution {
    public void reOrderArray(int [] array) {
          if(array.length==0||array.length==1) return;
        int oddCount=0,oddBegin=0;
        int[] newArray=new int[array.length];
        for(int i=0;i<array.length;i++){
            if((array[i]&1)==1) oddCount++;
        }
        for(int i=0;i<array.length;i++){
            if((array[i]&1)==1) newArray[oddBegin++]=array[i];
            else newArray[oddCount++]=array[i];
        }
        for(int i=0;i<array.length;i++){
            array[i]=newArray[i];
        }
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章