劍指offer:調整陣列順序使奇數位於偶數前面
阿新 • • 發佈:2018-12-16
題目描述
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
題目要求了在調整順序之後需要保證奇數和奇數,偶數和偶數之間的相對位置不變,因此,必須開闢新的空間。
兩種方法:
(1)建立兩個新的陣列temp1,temp2,遍歷原陣列array,如果遇到奇數,則將這個數存入temp1中,遇到偶數,則將這個數存入到temp2中。遍歷結束後將這兩個陣列中的數依次存入原陣列。(只遍歷了一遍陣列,時間複雜度為o(n),但是需要開闢兩個新空間,空間複雜度較高)
(2)建立一個新的陣列temp,對原陣列array做兩次遍歷,第一次遍歷之後,將所有的奇數取出來,存入到temp中,第二次遍歷後,將所有的偶數取出來存入到temp奇數的後面。(這次只建立了一個數組,開闢了一塊記憶體空間,空間複雜度較(1)小,但是需要遍歷兩次原陣列,時間複雜度增大2倍)。
實現1:
/*因為需要保持原陣列中奇數和奇數,偶數和偶數的相對位置不變,因此需要建立2個新陣列temp1,temp2, * 分別將奇數和偶數存入到temp1和temp2中,同時記錄奇偶陣列的長度。然後再將這兩個陣列存入原陣列中*/ public void reOrderArray(int [] array) { int [] temp1=new int[array.length]; int [] temp2=new int[array.length]; int j=0; int k=0; for (int i = 0; i < array.length; i++) { if((array[i]&1)==1){ temp1[j]=array[i];//如果是奇數,存入temp1 j++; }else{ temp2[k]=array[i]; k++; } } System.arraycopy(temp1, 0, array, 0, j); System.arraycopy(temp2, 0, array, j, k); // System.out.println(Arrays.toString(array)); }
/*建立一個新陣列temp,遍歷第一遍原陣列,將所有的奇數存入temp中,再遍歷第二遍原陣列,將所有的偶數存入到temp中。 * 最後返回新陣列temp*/ public void reOrderArray2(int [] array) { int len=array.length; int [] temp=new int[len]; int j=0; //遍歷第一遍,將所有的奇數存入temp for (int i = 0; i < len; i++) { if((array[i]&1)==1){ temp[j++]=array[i]; } } //遍歷第二遍,將所有的偶數存入temp for (int i = 0; i < len; i++) { if((array[i]&1)==0){ temp[j++]=array[i]; } } // array=temp;//直接這樣賦值,在自己電腦上執行時沒錯的,但是貼上到牛客上報錯。 // //原因是:在Java裡面,可以用複製語句”A=B”給基本型別的資料傳遞值,但是如果A,B是兩個同類型的陣列, // //複製就相當於將一個數組變數的引用傳遞給另一個數組;如果一個數組發生改變,那麼引用同一陣列的變數也要發生改變. //因此取樣arraycopy的方式 System.arraycopy(temp,0,array,0,len); System.out.println(Arrays.toString(array)); }