給你一個整型數組,做順序調整,要求:
1,奇數在前、偶數在後
2,效率高、節省記憶體
拿到這個題目的時候我首先想到的方法是:
1,對原數組做二等分,分别放入兩個數組a,b
2,循環a,b,把a的偶數與b的奇數交換位置
3,把兩個數組合到一起
可是這種方案新申請了2個數組,如果資料很大,這個記憶體開銷可想代價很大……
怎麼省記憶體呢,我是想不到了,然後百度了一下,發現了大俠的好方法,
主要是循環的合理應用,其實挺簡單的,實作如下:
public static void main(String[] args){
int[] arr = new int[];
Random random = new Random();
for(int index =; index <arr.length ; index++){
arr[index] = random.nextInt();
}
exchange(arr);
}
/**
* 借用&運算,判斷奇偶數
* @param arr
*/
public static void exchange(int[] arr){
long time1 = System.currentTimeMillis();
if(null == arr || arr.length<= ){
return;
}
int bef = ;
int back = arr.length-;
int temp ;
while(bef < back){
while( bef<back && (arr[bef]&) == ){//說明是奇數
bef++;
}
while( bef<back && (arr[back]&) == ){//說明是偶數
back--;
}
if( bef<back ){
temp = arr[bef];
arr[bef] = arr[back];
arr[back] = temp;
}
}
long time2 = System.currentTimeMillis();
System.out.println(""+(time2-time1));
}
首先大俠的辦法沒有新開辟空間,滿足了題目的2點要求。
然後判斷奇偶數首先想到的是n%2,大俠用的是&位運算,
我測試了一下,
如果是數組資料量小,兩者計算速度幾乎相同,如果資料量大了,&位運算速度就快一些了。
顯然這些小細節開發還是謹慎點好。
PS:
&運算規則:
兩個操作數中 位都為1,與運算結果為1;否則與運算結果為0;
操作數x & 1運算結果為1,逆推後,說明x的二進制末尾應是1,那麼x為奇數。
寫到這裡很開心,加油。