11【题目】输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
* 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
【思路】//方法1:前后两个数比较,若前为偶数后为奇数,即调换两者位置(未看懂,不如下面方法)
//方法2(较好的方法):前后设置两个指针,当前指针指向的数为偶数,后指针指向的数为奇数时,即调换两个数位置。
1 package com.exe3.offer; 2 3 /** 4 * 11【题目】输入一个整数数组,实现一个函数来调整该数组中数字的顺序, 5 * 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 6 * 【思路】 7 * @author WGS 8 * 9 */ 10 //1 2 3 4 5 11 public class ReOrderOddEven11 { 12 //方法1:前后两个数比较,若前为偶数后为奇数,即调换两者位置 13 public int[] getOrder2(int[] arr){ 14 if(arr==null||arr.length==0){ 15 System.out.println("Invalid arrays"); 16 } 17 int i,j; 18 for(i=1;i<arr.length;i++){//此处i设为1,方便比较前者 19 int temp=arr[i]; 20 if(!isEven(i)){//后者为奇数 21 22 for(j=i-1;j>=0&&(isEven(j));j--){//此处j设为0,即与i设为1的值比较 前者(j)为偶数 23 arr[j+1]=arr[j]; 24 } 25 arr[j+1]=temp; 26 } 27 28 } 29 return arr; 30 } 31 //判断是否为偶数 32 public boolean isEven(int n){ 33 if((n&0x1)==0){ 34 return true; 35 } 36 return false; 37 } 38 //方法2(较好的方法):前后设置两个指针,当前指针指向的数为偶数,后指针指向的数为奇数时,即调换两个数位置。 39 public int[] getOrder(int[] arr){ 40 if(arr==null||arr.length==0){ 41 System.out.println("Invalid arrays"); 42 } 43 int preIndex=0; 44 int endIndex=arr.length-1; 45 while(preIndex<endIndex){//要变成奇+偶组合 46 while(preIndex<endIndex && (arr[preIndex]&0x1)!=0){//是奇数,该数不用换,指针后移 47 preIndex++; 48 } 49 while(preIndex<endIndex && (arr[endIndex]&0x1)==0){//是偶数,该数不用换,指针前移 50 endIndex--; 51 } 52 if(preIndex<endIndex){ 53 int temp=arr[preIndex]; 54 arr[preIndex]=arr[endIndex]; 55 arr[endIndex]=temp; 56 } 57 } 58 return arr; 59 } 60 public static void main(String[] args){ 61 ReOrderOddEven11 r=new ReOrderOddEven11(); 62 int[] arr=new int[]{8,1,2,3,4,5}; 63 int[] arr2=r.getOrder(arr); 64 for(int s:arr2){ 65 System.out.print(s+" "); 66 } 67 } 68 }