13. 調整陣列使奇數位於偶數前面
阿新 • • 發佈:2018-12-14
題目
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。
思路1
暴力方法,不考慮時間複雜度,從頭掃描這個陣列,每碰到一個偶數時,拿出這個數字,並把位於這個數字後面的所有的數字往前面挪動一位。挪完之後在陣列的末尾有一個空位,這時把該偶數放入這個空位。由於沒碰到一個偶數就需要移動O(n)
個數字,因此總的時間複雜度是O(n^2)
思路2
在掃描這個陣列的時候,如果發現有偶數在奇數的前面,交換他們的位置就符合要求了。
因此可以維護兩個指標
,第一個指標初始化時指向陣列的第一個數字,它只向後移動;第二個指標初始化時指向陣列的最後一個數字,它指向前移動。在兩個指標相遇之前,第一個指標總是位於第二個指標的前面。如果第一個指標的數字是偶數,並且第二個指標指向的數字是奇數,我們就交換兩個數字。
package com.zhumq.leetcode;
public class OddBeforeEven {
/**
* 輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分
*/
public void order(int[] arr){
if(arr == null)
return;
//一個從後往前,一個從前往後
int i = 0;
int j = arr.length-1;
while(i<j){
if(isEven(arr[i]) && !isEven(arr[ j])){
int temp = arr[i];
arr[i]= arr[j];
arr[j] = temp;
}
else if(!isEven(arr[i]) && isEven(arr[j])){
i++;
}
else if(isEven(arr[i]) && isEven(arr[j])){
j--;
}else{
i++;
j--;
}
}
}
//判斷是否為偶數
public boolean isEven(int n){
return (n & 1) == 0;
}
}