参考自:《剑指Offer——名企面试官精讲典型编程题》
题目:调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
主要思路:扫描数组,若发现偶数在奇数前面,则交换它们的位置。使用两个指针,第一个指针从数组第一个元素开始向后扫描,第二个指针从数组最后一个元素开始向前扫描。若第一个指针指向偶数,第二个指针指向奇数,则交换它们的顺序,如此循环,直到第一个指针和第二个指针相遇,或者在第二指针的后面。
类比:这里的两个指针和快速排序的两个指针类似,这里是查找奇偶数,而快速排序是查找比基准数大或者小的数。
扩展性:可以修改查找条件,实现其他类似功能
关键点:双指针查找交换
时间复杂度:O(n)
public class ReorderArray {
public static void main(String[] args) {
int[] array = new int[10];
for (int i = 0; i < 10; i++) {
array[i] = i;
}
// 自定义交互条件
reorder(array, ReorderArray::isEven);
// [9, 1, 7, 3, 5, 4, 6, 2, 8, 0]
System.out.println(Arrays.toString(array));
}
private static void reorder(int[] array, Predicate<Integer> condition) {
if (array == null || array.length == 0) {
return;
}
int begin = 0;
int end = array.length - 1;
while (begin < end) {
//找到数组前面的偶数
while (begin < end && !condition.test(array[begin])) {
begin++;
}
//找到数组后面的奇数
while (begin < end && condition.test(array[end])) {
end--;
}
//交换奇偶数
if (begin < end) {
int temp = array[begin];
array[begin] = array[end];
array[end] = temp;
}
}
}
/**
* 是否偶数
*
* @param n the n
* @return boolean
*/
private static boolean isEven(int n) {
return (n & 1) == 0;
}
}