前言
本博文部分图片, 思路来自于剑指offer 或者编程珠玑
问题描述
思路
书中给出了两种思路
思路一 : 前后两个索引, 将前面的指针初始化为第一个偶数的位置, 将第二个指针初始化为从后向前数的第一个奇数的位置, 然后 只要前面的索引小于后面的索引, 则交换两个索引对应的数据, 更新两个索引的位置 [更新为下一个奇数/ 偶数的位置]
思路二 : 更加扩展的一种方式, 将判断奇偶的函数作为参数传入, 这样就可扩展为其他的将满足函数条件的数据 移动到不满足条件的数据之前, 比如 有如下一个需求, 将小于10的元素 移动到其他的大于等于10的元素之前, 就可以将参数函数传入 “bool isCondition(int x, int minNum) { return x > minNum }”
参考代码
/**
* file name : Test29OddBeforeEven.java
* created at : 5:01:37 PM Jun 5, 2015
* created by
*/
package com.hx.test04;
public class Test29OddBeforeEven {
// 将指定的数组中奇数调整到偶数的前面
public static void main(String []args) {
int[] arr = {18, 19, 20, 22, 27, 28, 32, 34, 37, 38, 38, 48, 48, 4, 6, 11, 17 };
oddBeforeEven01(arr);
Log.log(arr);
}
// 将arr中的奇数调整到偶数的前面
// 思路 : 两个索引, 一个指向第一个元素, 另一个指向最后一个元素
// 只要head < tail, 则更新head, tail, head更新到下一个偶数, tail更新到下一个奇数
// 如果更新head, tail完毕 head小于tail 则交换head, tail的数据
private static void oddBeforeEven01(int[] arr) {
int head = 0, tail = arr.length - 1;
while(head < tail) {
while(isOdd(arr[head]) && head < tail ) {
head ++;
}
while(isEven(arr[tail]) && head < tail ) {
tail --;
}
if(head < tail) {
Tools.swap(arr, head, tail);
} else {
break ;
}
}
}
// 判断x是否是奇数
private static boolean isOdd(int x) {
return !isEven(x);
}
// 判断x是否是偶数
private static boolean isEven(int x) {
return (x & 1 ) == 0;
}
}
效果截图
总结
第二种思路 这里就没有去实现了, 可以使用 “java.lang.invoke”包[jdk 1.7或者之上]中相关api实现
注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!