题目要求:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
这个题目其实做起来并不难,书上这里着重讲的是这个程序的扩展性。如果题目更改判断条件之后,我们应该怎样改变自己的源代码?最优方法是将这个判断条件抽象出来,让调用者去实现,每次调用方法时必须传入一个判断是否交换的标准,这里我们用接口来实现。
至于交换方法的逻辑,做起来其实非常简单,类似于快速排序原理,找两个下标指针,一个从前面开始遍历,另一个从后面开始遍历,若指针所指的元素满足交换条件(在本题中是前面的数是偶数后面的数是奇数),则进行交换,否则,则按各自的方向继续遍历,直至两者相交为止。(在快速排序中,判断条件是是否大于枢轴的值)。实现代码如下:
package com.offer;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
public class ReorderArray {
/*
* 调整数组顺序使奇数位处于偶数位前面 eg: 1 2 3 4 6 ==》 1 5 3 4 2
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
ArrayList<Integer> source = new ArrayList<Integer>();
while (!input.hasNext("0")) {
source.add(input.nextInt());
}
input.close();
reorder(source , new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
});
for (int i = 0; i < source.size(); i++) {
System.out.print(source.get(i) + " ");
}
}
private static void reorder(ArrayList<Integer> source, Comparator<Integer> comparator) {
// TODO Auto-generated method stub
if (source == null || comparator == null) {
throw new RuntimeException("输入错误!");
}
int i = 0;
int j = source.size() - 1;
Integer tmp = null;
while(j >= i){
while(j >= i && i % 2 != 1){
i++;
}
while(j >= i && j % 2 != 0){
j--;
}
//交换两者
if (j >= i) {
tmp = source.get(i);
source.set(i, source.get(j));
source.set(j, tmp);
}
i++;
j--;
}
}
}