【劍指Offer】13、調整數組順序使奇數位於偶數前面


  題目描述:

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

  解題思路:

  首先,如果不考慮奇數和奇數,偶數和偶數的相對位置,那么我們有一種雙指針解法來求解,類似於快排,維護兩個指針,第一個指針指向數組的第一個數字,第二個指針指向數組的最后一個數字。第一個指針向后移,第二個指針向前移,如果第一個指針指向偶數,第二個指針指向的是奇數,則交換着兩個數字,接着繼續移動直到兩指針相遇。

  上面的方法看似不錯,但是對本題不適用,因為本題有相對位置不變的要求,直接交換會導致相對位置改變。因此,我們采用下面的思路來解決本題。

  本題解法:對數組進行遍歷,設置兩個指針even和odd,even指向當前第一個偶數,odd從這個偶數之后開始查找,找到第一個奇數,此時為了相對位置不變,不能直接交換even和odd,而是將從even到odd-1的元素都依次向后移一個位置,將odd指向的那個奇數放到even的位置。然后再找下一個偶數,重復這一過程,最終就可以將奇數都放到偶數的前面,並且保證了相對位置的不變。

  編程實現(Java):

   public void reOrderArray(int [] array) {
        int len=array.length;
        int even=0,odd=0; //當前序列的第一個奇數和第一個偶數
        while(odd<len && even<len){
            while(even<len && array[even]%2!=0) //找到第一個偶數even
                even++;
            odd=even+1;
            //找偶數之后的第一個奇數
            while(odd<len && array[odd]%2==0)
                odd++;
            if(odd>=len)  //注意判斷,防止溢出
                break;
            //把奇數取出來,從even到odd-1的元素都向后移
            int temp=array[odd];
            for(int i=odd;i>even;i--)
                array[i]=array[i-1];
            array[even]=temp; //奇數放在原來even的位置
            even++;
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM