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

劍指offer——(4)調整陣列順序使奇數位於偶數前面

在這裡提供兩種思路。。 

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; //奇數移動到原偶數位置
					}					
				}
			}
        }            
}