首页 > 代码库 > 面试题14: 调整数组顺序使奇数位于偶数前面

面试题14: 调整数组顺序使奇数位于偶数前面

题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

基本解法:维护两个分别指向数组第一个和最后一个元素的指针。两个指针相向移动,若第一个指针指向的数字为偶数,第二个指针指向的数字为奇数,则交换这两个数字,然后移动两个指针。其他情况,相应的移动指针。

考虑可扩展性的解法: 如果题目改成把数组分成两部分,负数在非负数的前面呢?又或者是能被3整除放在不能被3整除的数字前面呢?

如果我们提供的不仅仅是解决一个问题的方法,而是解决一系列同类型问题的通用方法,那么这就是一个扩展性很强的程序。面试官希望我们能够给出一个模式,在这个模式下能够很方便地把已有的解决方案扩展到同类型的问题上去。

import java.util.Scanner;
import java.util.function.Predicate;

public class Main {
    
    //利用jdk里已有的函数式接口Predicate
    //使用方法中的逻辑来判断num是应该在前半部分还是应该在后半部分。
    static Predicate<Integer> isEven = (num) -> { return num % 2 == 0; };
    
    public static void solve(int[] num, int low, int high) {
        if (num == null) num = new int[0];
        if (num.length == 0) return;
        while (low < high) {
            if (isEven.test(new Integer(num[low])) && !isEven.test(num[high])) {
                int t = num[low];
                num[low] = num[high];
                num[high] = t;
                low++;
                high--;
            } else {
                if (!isEven.test(num[low])) low++;
                if (isEven.test(num[high])) high--;
            }
        }
    }
    
    public static void main(String args[]) {
        int n, num[];
        num = new int[1000];
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            n = in.nextInt();
            for (int i = 0; i < n; i++) num[i] = in.nextInt();
            solve(num, 0, n - 1);
            for (int i = 0; i < n; i++) System.out.printf("%d ", num[i]);
            System.out.println();
        }
        in.close();
    }
}

 

面试题14: 调整数组顺序使奇数位于偶数前面