題目:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得全部奇數位於數組的前半部分,全部偶數位於數組的後半部分。程序員
一、基本實現: 面試
若是不考慮時間複雜度,最簡單的思路應該是從頭掃描這個數組,每碰到一個偶數時,拿出這個數字,並把位於這個數字後面的全部的數字往前面挪動一位。 挪完以後在數組的末尾有一個空位,這時把該偶數放入這個空位。因爲沒碰到一個偶數就須要移動O(n)個數字,所以總的時間複雜度是O(n2).可是,這種 方法不能讓面試官滿意。不過若是咱們在聽到題目以後立刻可以說出這個解法,面試官至少會以爲咱們的思惟很是靈敏。數組
二、只完成基本功能的解法,僅適用於初級程序員函數
這個題目要求把奇數放在數組的前半部分,偶數放在數組的後半部分,所以全部的奇數應該位於偶數的前面,也就是說咱們在掃描這個數組的時候,若是發現有偶數在奇數的前面,咱們能夠交換他們的數序,交換以後就符合要求了。spa
所以咱們能夠維護兩個指針,第一個指針初始化時指向數組的第一個數 字,它只向後移動;第二個指針初始化時指向數組的最後一個數字,它指向前移動。在兩個指針相遇以前,第一個指針老是位於第二個指針的前面。若是第一個指針 的數字是偶數,而且第二個指針指向的數字是奇數,咱們就交換兩個數字。指針
三、考慮可擴展性的解法,秒殺Offer開發
若是是面試應屆畢業生或者工做時間不長的程序員,面試官會滿意前面的代碼,但若是應聘者申請的是資深的開發職位,那面試官可能會接着問幾個問題。it
面試官:若是把題目改爲數組中的數按照大小分爲兩部分,全部的負數在全部的非負數的前面,該怎麼作?class
若是再把題目改改,變成 把數組中的數分紅兩部分,能被3整除的數都在不能被3整除的數的前面,怎麼辦?test
這就是面試官在考察咱們對可擴展性的理解,即但願咱們可以給出一個模式,在這個模式下可以很方面第把已有的解決方案擴展到同類型的問題上去。
因而咱們寫出下面的代碼:
package cglib;
public class DeleteNode {
public void order(int[] array)
{
if(array==null||array.length==0)
return ;
int start=0;
int end=array.length-1;
while(start<end){
while(start<end&&!isEven(array[start])){
start++;
}
while(start<end&&isEven(array[end])){
end--;
}
if(start<end){
int temp=array[start];
array[start]=array[end];
array[end]=temp;
}
}
}
public boolean isEven(int n){
return (n & 1) == 0; // (n & 1) == 0爲偶數
}
public static void main(String[] args){
DeleteNode test = new DeleteNode();
int[] arr= {1,2,3,4,5,6,12,7,8,9,10};
test.order(arr);
for(int item:arr)
System.out.println(item);
}
}
輸出:1 9 3 7 5 6 12 4 8 2 10