19. 調整數組順序是奇數位於偶數前面
問題描述
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,是的所有奇數位於數組的前半部分,所有偶數位於數組的後半部分
問題分析
我們維護了兩個指針,一個 start
指針指向數組頭,一個 end
指針指向數組尾。
下面開始我們的判斷內容:
- 保證
start < end
- 如果滿足 1 的情況下
start
指向第一個偶數(start
是從前往後),end
指向第一個奇數(end
是從後往前) - 如果不滿足2,哪個不滿足就移動哪個指針,
start++, end--
; - 交換兩個指針指向的數
優化下:判斷奇數偶數這個是題目內容,如果我們有別的條件,有應該怎麼辦,所以我將其主要的判斷內容,抽出來,寫了個函數,我們只需要重寫這個函數就可以實現不同的功能了。
代碼
import java.util.Arrays;
/**
* Class day19 ...
*
* @author LiJun
* Created on 2019/2/14
*/
// 調整數組順序是奇數位於偶數前面
public class day19 {
public static void main(String[] args) {
int[] a = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
reorderOddEvent(a);
System.out.println(Arrays.toString(a));
}
public static void reorderOddEvent(int[] a){
if(a == null || a.length == 0){
return;
}
int start = 0;
int end = a.length - 1;
while(start < end){
// 在這裏我們首先要保證的是 start < end 而且 是奇數 如果是奇數 start指針向後移
while(start < end && !isEvent(a[start])){
start ++;
}
// 在這裏我們首先要保證的是 start < end 而且 是奇數 如果是偶數 end指針向前移
while(start < end && isEvent(a[end])){
end --;
}
// 如果start指針指向奇數 end指針指向偶數,交換兩個數
if(start < end){
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
}
// 單獨抽象出來這個判斷條件是爲了解決這一系列的問題 不只是奇偶數
public static boolean isEvent(int n){
if((n & 1) != 0){
return false;
}
return true;
}
}