调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
第一种方法是定义两个指针,分别从数组的前和后开始扫描数组,如果第一个指针指向的数字是偶数,第二个指针指向的数字是奇数,则交换着两个数字,并确保第一个指针始终在第二个指针前面。
第二种方法是一种可扩展的解法,即用一个单独的函数来判断数字是不是符合标准,也就是将整个函数解耦成两部分:一部分是用来判断数字应该在数组的前半部分还是后半部分,另一部分是拆分数组的操作。
代码实现(Java)
package jianzhioffer;
import java.util.Scanner;
public class ReOrderArray {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String[] str = scanner.nextLine().split(",");
int[] num = new int[str.length];
for (int i = 0; i < str.length; i++) {
num[i] = Integer.parseInt(str[i]);
}
reOrderArray(num);
for (int i = 0; i < num.length; i++) {
System.out.print(num[i]+" ");
}
}
scanner.close();
}
/**
* 方法1:使用两个指针,分别从前和从后扫描数组,如果遇到前偶后奇,则交换
* @param array
*/
// private static void reOrderArray(int[] array) {
// if (array==null||array.length==0){
// return;
// }
// int begin = 0;
// int end = array.length-1;
// while (begin<end){
//向后移动begin,直到它指向偶数
// while (begin<end&&(array[begin]&0x1)!=0){
// begin++;
// }
//向前移动end,直到它指向奇数
// while (begin<end&&(array[end]&0x1)==0){
// end--;
// }
// if (begin<end){
// int temp = array[begin];
// array[begin] = array[end];
// array[end] = temp;
// }
// }
// }
/**
* 方法2:可扩展的解法
* 把这个函数解耦成两部分:一是判断数字应该在数组前半部分还是后半部分的标准;二是拆分数组的操作
* @param array
*/
public static void reOrderArray(int[] array){
if (array==null||array.length==0)
return;
int begin = 0;
int end = array.length-1;
while (begin<end){
if (isEven(array[begin])&&!isEven(array[end])){
int temp = array[begin];
array[begin] = array[end];
array[end] = temp;
}else if (!isEven(array[begin])&&isEven(array[end])){
begin++;
}else if (isEven(array[begin])&&isEven(array[end])){
end--;
}else {
begin++;
end--;
}
}
}
public static boolean isEven(int n){
return (n&1)==0;
}
}
上面的代码不能保证奇数和奇数、偶数和偶数之间的相对位置不变。
如何解决这个问题呢?
可以采用类似冒泡排序的算法,前偶后奇就交换
/**
* 判断一个数是不是偶数
* @param n
* @return
*/
public static boolean isEven(int n) {
return (n & 1) == 0;
}
/**
* 保证奇数与奇数、偶数与偶数的相对位置不变
* 思路:类似冒泡算法,前偶后奇就交换
*
* @param array
*/
public static void reOrderArray(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = array.length - 1; j > i; j--) {
if (!isEven(array[j]) && isEven(array[j - 1])) {
int temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
}
}