面试题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();
    }
}
时间: 2024-11-14 00:22:12

面试题14: 调整数组顺序使奇数位于偶数前面的相关文章

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

使用两个指针,在数组头尾相对移动: 循环结束条件:头和尾重叠活着头在尾之后 左边指针右移条件:当前数是奇数 右边指针左移条件:当前数是偶数 当且仅当左边指针是偶数,右边指针是奇数,交换两个指针的值 此题注意扩展,函数功能的重用. package offer; import java.util.Arrays; /*面试题 14:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该函数数组中数字的顺序,使得所有奇数位于数组的前半部分,所有的数组位于数组的后半部分.*/ pub

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

// 面试题14_调整数组顺序使奇数位于偶数前面.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void swap(int *begin,int *end) { int temp; temp=*begin; *begin=*end; *end=temp; } void ReorderOddEven(int *pData,unsigned int len

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

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初始化时候指向数组尾部,第一个指针指向的数字总是偶数,第二个指针指向的数字总是奇数,如果第一个指针在第二个指针之前,则交换两指针指向的元素. 1 package Solution; 2 3 /** 4 * 剑指offer面试题14:调整数组顺序是奇数位于偶数前面 5 * 题目:输入一个整数数组,实现一

剑指offer-面试题14.调整数组顺序使奇数位于偶数的前面

题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序, 使得所有的奇数位于数组的前半部门,所有的偶数位于数组的后半部门. 这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑 我们将数组从前开始索引只要发现偶数这将偶数取出来并且将偶数后 面的元素全部前移一个然后将偶数插入到最后,这样扫描一遍之后 就将偶数全部放在了后半部门,奇数放在了前半部分.但是效率不好 每次遇到偶数都要移动偶数后面的所有元素再加上遍历数组的时间 则达到了O(n2) 我们可以用两个索引或者指针,一个指向数组的

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

描述:  输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 假如只需要将奇数位于数组前半部分,偶数位于数组的后半部分, 直接用快速排序解决就好. 但是这里还需要保证奇数间,偶数之间的相对位置不变, 在这里就使用插入排序好了. 1 class Solution { 2 public: 3 void reOrderArray(vector<int> &array) {

剑指offer_面试题14_调整数组顺序使奇数位于偶数前面(函数指针用法)

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 1.一般想法,不考虑时间复杂度: 每次遍历数组,碰到一个偶数就拿出来,将后面所有数字向前挪动一位,在将该偶数放到最后. 2.利用冒泡排序的思想,两个指针,一前以后,如果前为偶数,后为奇数,就交换. 算法如下: void Reorder_array(int p[],int length) { if(NULL == p || length <= 0) return; int i

剑指offer 面试14—调整数组顺序使奇数位于偶数前面

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解法一:O(n^2) 从头扫描数组,每碰到一个偶数,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位.挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位中. 由于每碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n^2). 解法二:O(n) 类似快排,两个指针,一个指向数组头,只向后移动,一个指向数组尾,只向前移动.如果第一个指针指向的数字是偶

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

题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums =?[1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一. 提示: 1 <= nums.length <= 50000 1 <= nums[i] <= 10000 思路 代码 时间复杂度:O(n) 空间复杂度:O(1) class Solution { public: vector<int>

【面试题014】调整数组顺序使奇数位于偶数前面

[面试题014]调整数组顺序使奇数位于偶数前面    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数     位于    数组的前半部分,所有偶数位于数组的后半部分. 1.第一个指针初始化为指向数组的第一个数字,他向后移动 2.第二个指针初始化为指向数组的最后一个数字,他向前面移动, 3.在两个指针相遇之前,第一个指针总是位于第二个指针的前面, 4.如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数, 我们就交换两个数字,否者如果是一个满足,或者都不满足就按照规

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

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组