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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题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: 调整数组顺序使奇数位于偶数前面的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面

剑指Offer-代码的完整性面试题21:调整数组顺序使奇数位于偶数前面

剑指Offer面试题21. 调整数组顺序使奇数位于偶数前面

剑指Offer面试题 九度OJ1516:调整数组顺序使奇数位于偶数前面

剑指Offer面试题 九度OJ1516:调整数组顺序使奇数位于偶数前面

剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前