题目:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路分析:
这个题目的意思是,一旦出现偶数在奇数的前面,就把这两个数的位置交换一下。
准备两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动。
第二个指针初始化时指向该数组的最后一个元素,它只向前移动。
在两个指针相遇之前,第一个指针总是位于第二个指针前面。
当第一个指针在第二个指针位置的前面,且第一个指针指向的数字不是偶数,则第一个指针往后移动。
当第一个指针在第二个指针位置的后面。且第二个指针指向的数字不是奇数,则第二个指针往前移动。
如果第一个指针指向偶数,并且第二个指针指向奇数,则交换这两个数字。
代码:
package swordOffer;
import java.lang.reflect.Array;
import java.util.Arrays;
/*
* 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
* 使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,
* 并保证奇数和奇数,偶数和偶数之间的相对位置不变。
* */
public class reOrderArray {
public static void reOrderArray(int [] array) {
if(array == null || array.length < 0) {
return;
}
int left = 0;
int right = array.length-1;
while(left < right) {
//向后移动第一个指针,直到它指向偶数
while(left < right && !isEven(array[left])) {
left++;
}
//向前移动第二个指针,直到它指向奇数
while(left < right && isEven(array[right])) {
right--;
}
if(left < right) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
}
//判断是否为偶数
public static boolean isEven(int i) {
if(i % 2 == 1) {
return false;
}else {
return true;
}
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
reOrderArray(arr);
for(int num : arr) {
System.out.print(num + " ");
}
}
}