一、題目
輸入一個整數數組,實現一個函數來調整該數組中數組的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。要求時間複雜度爲O(n)。
二、思考與分析
題目要求把奇數放在數組的前半部分,偶數放在數組的後半部分,因此所有的奇數應該位於偶數的前面。也就是掃描數組的時候,如果發現有偶數出現在奇數的前面,就交換它們的順序,交換之後就符合要求了。
另外要求時間複雜度爲O(n),因此我們可以維護兩個指針,第一個指針初始化時指向數組的第一個數字,遇到奇數,它就向後移動;第二個指針初始化時指向數組的最後一個數字,遇到偶數,它就向前移動。在兩個指針相遇之前,第一個指針總是位於第二個指針的前面。如果第一個指針指向的數字是偶數,並且第二個指針指向的數字是奇數,我們就交換這兩個數字。
三、代碼實現
public class Test14 {
//將奇數放在數組的前半部分,偶數放在數組的後半部分
public static void ReorderOddEvent(int[] array) {
if (array == null) {
return;
}
int begin = 0;
int end = array.length - 1;
while (begin < end) {
while (begin < end && (array[begin] & 0x1) != 0) {
begin++;
}
while (begin < end && (array[end] & 0x1) == 0) {
end--;
}
if (begin < end) {
int temp = array[begin];
array[begin] = array[end];
array[end] = temp;
}
}
}
public static void display(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
public static void main(String[] args) {
int[] array = { 1, 2, 3, 4, 5 ,6,7};
ReorderOddEvent(array);
display(array);
}
}
四、結果
1,7,3,5,4,6,2,
五、本題擴展
5.1 擴展題目
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
5.2 題目分析
需要保證數組中奇數都出現在前半部分,偶數都出現在後半部分,還要保證奇數和奇數,偶數和偶數之間的相對位置不變,即原來在前面的奇數依然出現在數組的前面。
要想保證O(n)的時間複雜度,可以犧牲空間來換取。
1. 依然使用兩個指針,第一個指針初始化時指向數組的第一個數字,它只會向後移動;第二個指針初始化時指向數組的最後一個數字,它只會向前移動。
2. 另外創建一個數組,並創建兩個指針,一個奇數指針下標爲0,一個偶數指針爲數組最後一個下標(數組長度-1)分別記錄奇數和偶數的位置。
3. 當第一個指針指向的數字爲奇數時,就將該數字存入到新建數組奇數指針的位置,並將奇數指針的值加1;當第二個指針指向的數字爲偶數時,就將該數字存入到新建數組偶數指針的位置,並將偶數指針減1。
4. 直到數組被掃描完一遍,奇數和偶數也都重新調整位置完畢。
5.3 代碼實現
public class Test14 {
//將奇數放在數組的前半部分,偶數放在數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變
public static void reOrderByOrder(int[] array){
if (array == null) {
return;
}
int len = array.length;
int[] arr = new int[len];
int begin = 0;
int end = len-1;
for (int i = 0; i < array.length; i++) {
arr[i] = array[i];
}
for (int i = 0; i < arr.length; i++) {
if((arr[i]&0x1)!=0){
array[begin++] = arr[i];
}
if((arr[len-i-1]&0x1)==0){
array[end--] = arr[len-i-1];
}
}
}
public static void display(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
public static void main(String[] args) {
int[] array = { 1, 2, 3, 4, 5 ,6,7};
//ReorderOddEvent(array);
reOrderByOrder(array);
display(array);
}
}
5.4 結果展示
1,3,5,7,2,4,6,