【劍指Offer學習】【面試題14 :調整陣列順序使奇數位於偶數前面】
阿新 • • 發佈:2019-01-06
題目:輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位予陣列的後半部分。
這個題目要求把奇數放在陣列的前半部分, 偶數放在陣列的後半部分,因此所有的奇數應該位於偶數的前面。也就是說我們在掃描這個陣列的時候, 如果發現有偶數出現在奇數的前面,我們可以交換它們的順序,交換之後就符合要求了。
因此我們可以維護兩個指標,第一個指標初始化時指向陣列的第一個數字,它只向後移動:第二個指標初始化時指向陣列的最後一個數字, 它只向前移動。在兩個指標相遇之前,第一個指標總是位於第二個指標的前面。如果第一個指標指向的數字是偶數,並且第二個指標指向的數字是奇數,我們就交換這兩個數字。
程式碼實現:
public class Test14 {
/**
* 輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,
* 使得所有奇數位於陣列的前半部分,所有偶數位予陣列的後半部分。
*
* @param arr 輸入的陣列
*/
public static void reorderOddEven(int[] arr) {
// 對於輸入的陣列為空,或者長度小於2的只接返回
if (arr == null || arr.length < 2) {
return ;
}
// 從左向右記錄偶數的位置
int start = 0;
// 從右向左記錄奇數的位置
int end = arr.length - 1;
// 開始調整奇數和偶數的位置
while (start < end) {
// 找偶數
while (start < end && arr[start] % 2 != 0) {
start++;
}
// 找奇數
while (start < end && arr[end] % 2 == 0) {
end--;
}
// 找到後就將奇數和偶數交換位置
// 對於start=end的情況,交換不會產生什麼影響
// 所以將if判斷省去了
int tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
}
}
/**
* 輸出陣列的資訊
*
* @param arr 待輸出陣列
*/
public static void printArray(int[] arr) {
if (arr != null && arr.length > 0) {
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
reorderOddEven(array);
printArray(array);
}
}
執行結果: