19. 调整数组顺序是奇数位于偶数前面
问题描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,是的所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
问题分析
我们维护了两个指针,一个 start
指针指向数组头,一个 end
指针指向数组尾。
下面开始我们的判断内容:
- 保证
start < end
- 如果满足 1 的情况下
start
指向第一个偶数(start
是从前往后),end
指向第一个奇数(end
是从后往前) - 如果不满足2,哪个不满足就移动哪个指针,
start++, end--
; - 交换两个指针指向的数
优化下:判断奇数偶数这个是题目内容,如果我们有别的条件,有应该怎么办,所以我将其主要的判断内容,抽出来,写了个函数,我们只需要重写这个函数就可以实现不同的功能了。
代码
import java.util.Arrays;
/**
* Class day19 ...
*
* @author LiJun
* Created on 2019/2/14
*/
// 调整数组顺序是奇数位于偶数前面
public class day19 {
public static void main(String[] args) {
int[] a = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
reorderOddEvent(a);
System.out.println(Arrays.toString(a));
}
public static void reorderOddEvent(int[] a){
if(a == null || a.length == 0){
return;
}
int start = 0;
int end = a.length - 1;
while(start < end){
// 在这里我们首先要保证的是 start < end 而且 是奇数 如果是奇数 start指针向后移
while(start < end && !isEvent(a[start])){
start ++;
}
// 在这里我们首先要保证的是 start < end 而且 是奇数 如果是偶数 end指针向前移
while(start < end && isEvent(a[end])){
end --;
}
// 如果start指针指向奇数 end指针指向偶数,交换两个数
if(start < end){
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
}
// 单独抽象出来这个判断条件是为了解决这一系列的问题 不只是奇偶数
public static boolean isEvent(int n){
if((n & 1) != 0){
return false;
}
return true;
}
}