劍指offer——(4)調整陣列順序使奇數位於偶數前面
阿新 • • 發佈:2018-11-12
在這裡提供兩種思路。。
public class Solution { /* 最愚蠢的辦法:建立一個等長陣列,先迴圈一遍算出陣列中奇數的個數(或者偶數 的個數),再次迴圈,從頭開始放奇數,從尾到頭放偶數,最後將完成的陣列返回 */ public void reOrderArray(int [] array) { int arr[] = new int[array.length]; int length = arr.length,count = 0; for(int i=0;i<length;i++) if(array[i]%2!=0) count++; for(int i=0,j=0,z=count;i<length;i++){ if(array[i]%2!=0){ arr[j] = array[i]; j++; } else{ arr[z] = array[i]; z++; } } for(int i=0;i<length;i++) array[i] = arr[i]; } }
public class Solution { /* 講解一下別人的解法,大概思路是,每次迴圈找到位置i的第一個偶數,從j=i+1的位置找到第一個奇數用 一個臨時變數儲存之,然後[i,...,j-1]位置的數全部後移一位,最後將j位置上的奇數放到i位置的原 偶數位置上,結束迴圈的條件是i位置後找不到有array[y]為偶數,即奇數已經全部移動到所有偶數前面 */ public void reOrderArray(int [] array) { int length = array.length,temp = 0; //儲存將要移動i位置奇數的臨時變數 for(int i=0;i<length;i++) { if(array[i]%2==0) { int j=i+1,k; for(;j<length;j++) { if(array[j]%2!=0) { temp = array[j]; break; } } k=j; //若已經排好則j自加到length if(k!=length) { //k==length此後都將不執行 也即不再需要移動陣列中的數字 while(k>=i+1) { array[k] = array[k-1]; //後移 //if(k==i+1) break; k--; } array[i] = temp; //奇數移動到原偶數位置 } } } } }