1. 程式人生 > >劍指offer:調整陣列順序使奇數位於偶數前面

劍指offer:調整陣列順序使奇數位於偶數前面

題目描述

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變

題目要求了在調整順序之後需要保證奇數和奇數,偶數和偶數之間的相對位置不變,因此,必須開闢新的空間。

兩種方法:

(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));
		
	}