輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
解析:如果僅考慮奇數放在偶數前面,不考慮奇數和奇數,偶數和偶數之間的相對位置不變的話,可以用以下代碼:
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];
}
}
}