劍指offer 面試題21:調整數組順序使奇數位於偶數前(java)

題目描述:

      輸入一個整數數組,實現一個函數調整該數組中的數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分。

解析:

      1、維護兩個指針p1,p2。首先,第一個指針p1指向第一個元素,第二個指針p2指向最後一個元素。

      2.、第一個指針p1向後移動,直到它指向偶數;第二個指針p2向前移動,直到它指向奇數。使用(where)

      3、交換兩指針指向的元素。

      4、循環上訴步驟,直到p1>=p2。(如下圖所示,紅色爲p1,藍色爲p2)

1 2 3 4 5
1 2 3 4 5
1 5 3 4 2
1 5 3 4 2
1 5 3 4 2
public static void reOrderArray(int [] array) {
		if(array == null || array.length <=0) {
			return;
		}
		
		int p1 = 0;
		int p2 = array.length-1;
		while(p1<p2) {
			
			// 使p1指向偶數
			while(p1 < p2 && ((array[p1]&1) == 1)) {
				p1++;
			}
			// 使p2指向奇數
			while(p1 < p2 && ((array[p2]&1) != 1)) {
				p2--;
			}
			
			if(p1 <p2) {
				
				array[p1] = array[p1]^array[p2];
				array[p2] = array[p1]^array[p2];
				array[p1] = array[p1]^array[p2];
//				int temp = array[p1];
//				array[p1] = array[p2];
//				array[p2] = temp;
			}
		}

舉一反三:

把數組中的數按大小分爲兩部分,所有負數都在非負數的前面,或着把數組中的數分爲兩部分,把大於a的數字放在前面,小於等於a的數字放在後面。可以通過修改第二個和第三個while語句的循環條件來實現。

public static void main(String[] args) {
		int [] arr = {1,2,3,4,5,4,6,8,3,3,5,7};
		reOrderArray(arr);
		for(int a:arr) {
			System.out.print(a+" ");
		}
	}
	
	public static void reOrderArray(int [] array) {
		if(array == null || array.length <=0) {
			return;
		}
		
		int p1 = 0;
		int p2 = array.length-1;
		while(p1<p2) {
			
			// 使p1指向偶數 ((array[p1]&1) == 1)
			while(p1 < p2 && fun(array,p1)) {
				p1++;
			}
			// 使p2指向奇數 ((array[p2]&1) != 1)
			while(p1 < p2 && !fun(array, p2)) {
				p2--;
			}
			
			if(p1 <p2) {
				
				array[p1] = array[p1]^array[p2];
				array[p2] = array[p1]^array[p2];
				array[p1] = array[p1]^array[p2];
//				int temp = array[p1];
//				array[p1] = array[p2];
//				array[p2] = temp;
			}
		}
		
	}
	
	public static boolean fun(int[] arr, int index) {
		
		return arr[index] >=5;
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章