題目描述
public class Solution { public void reOrderArray(int [] array) { int jishu=0; int oushu=0; int i=0; int k=0; while(i<array.length&&k<array.length){ while(i<array.length){ if(array[i]%2==0){ oushu=array[i]; break; } i++; } k=i+1; while(k<array.length){ if(array[k]%2!=0){ jishu=array[k]; break; } k++; } if(k<array.length){ for(int j=k;j>i;j--){ array[j]=array[j-1]; } array[i++]=jishu; }else{ break; } } } }
這個題不算難,開始的時候思路錯了,半天沒繞過彎......
1.開始考慮到,如果技術和偶數的查找都從前往后那么,每次查找到偶數之后,還要從當前位置往后奇數,比較麻煩,為什么不從前邊找偶數,從后邊找奇數呢。。。后來證明自己太傻*了,沒看清楚題,要求奇偶數的相對位置不變
2.后來從頭開始找偶數,從找到偶數的位置開始找奇數,都找到之后把他們互換。。。。。。 又傻*了。這樣做是會改變奇偶數各自的前后相對位置。
3.正解:每當找到前面的偶數和后面的奇數之后,那么把之間的部分(包括那個偶數)統一后移一位, 因為之間的都是偶數(從找到的偶數后面開始找到的第一個奇數和開始找到的偶數之間肯定都是偶數了),之前又沒有偶數了(因為找的是從左往右第一個偶數),把他們統一后移一位,這樣把提前保存起來的那個奇數放到前邊空出來的那一位。這樣相當於 132457 把5移動到2 4這兩個偶數的前面,1 和5本來就是前后順序的。這樣堡整理調整之后的奇偶各自的相對順序不會變。
4,。最后一個小點需要注意的,那就是在最后進行統一后移一位操作時,需要判斷依次k的范圍是否符合規范,因為可能前邊一直沒有break,導致k變成了最大值array.length。
這種解法的最壞時間復雜度為O(n平方);因為找偶數復雜度為n,找后面的奇數加上移動之間的數字也是n級別的復雜度,總體n的平方
可用用空間換時間的做法,new一個數組,從頭開始遍歷,遇到偶數保存進新數組,並且刪除原先的偶數,最后將偶數部分接在奇數部分之后.
這個可以使用動態數組,也可以求出奇數的個數為n,遍歷的時候從1開始保存奇數,從n開始保存偶數。時間復雜度為O(n)