剑指Offer-->调整数组顺序使奇数位于偶数前面,并按顺序排列(2种方法)
从表面看好像这道题目很简单,其实做起来并没有想象中简单,个人觉得比较困难的点在于当奇数偶数已经分开但顺序没有排列的时候,对两半部分数组进行操作是稍微有些复杂的。提供了两种解法,希望大家能够有所借鉴。
import java.util.Arrays; public class reOrderArray { public void reOrderArrayDemo1(int[] array) { int p1 = 0; int p2 = array.length - 1; int i ; while (p1 < p2) { if (array[p1] % 2 == 1 && p1 < p2) { //p1的值不为偶数,向后移动 p1++; } if (array[p2] % 2 == 0 && p2 > p1) { //p2的值不为奇数,向前移动 p2--; } //当指针p1所在位置的值是偶数且指针p2所在位置的值是奇数时,将两位置处的值进行倒换 if (array[p1] % 2 == 0 && array[p2] % 2 == 1) { int temp = array[p1]; array[p1] = array[p2]; array[p2] = temp; } } for (i = 0; i < array.length;i++) { if(array[i] % 2 == 0){ //当数组元素为奇数时,使指针不断向后移动,直到遇到偶数停止,并将此时的位置记录 break; } } reOrderArray.sort(array , 0 , i); reOrderArray.sort(array , i , array.length); } public static void sort(int array[], int begin , int end) { //对前面为奇数 后面为偶数的数组进行排序 for(int i = begin;i < end;i++){ int Min = i; for(int j = i + 1;j < end;j++){ if(array[j] < array[Min]){ Min = j; } } if(Min != i){ int temp = array[Min]; array[Min] = array[i]; array[i] = temp; } } } public void reOrderArrayDemo2(int[] array){ int[] copyOfArray = Arrays.copyOf(array , array.length); //重新开辟一个数组,将原数组进行复制 Arrays.sort(copyOfArray);//我承认我无耻的直接调用了排序的方法 =。=|| int flag = 0; //对数组下标进行标记 /** * 对copyOfArray数组进行遍历,遇到奇数进行取出,并放到array数组中,并使flag + 1 */ for(int i = 0;i < copyOfArray.length;i++){ if(copyOfArray[i] % 2 == 1){ array[flag++] = copyOfArray[i]; } } /** * 再次遍历,取出偶数,放到array数组中,同上 */ for(int i = 0;i < copyOfArray.length;i++){ if(copyOfArray[i] % 2 == 0){ array[flag++] = copyOfArray[i]; } } } public static void main(String args[]) { reOrderArray r = new reOrderArray(); int[] array = {2 , 7 , 1 , 2 , 3 , 4 , 5 , 7 , 4}; r.reOrderArrayDemo1(array); System.out.println(); for(int i = 0;i < array.length;i++){ System.out.print(array[i] + " "); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。