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

来源:互联网 发布:java实现扫码支付 编辑:程序博客网 时间:2024/05/20 01:44

完整代码地址

完整代码地址

题目

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路

在代码注释里面

代码

/** * 题目: * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序, * 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分, * 并保证奇数和奇数,偶数和偶数之间的相对位置不变。 *  * 思路: * 感觉这道题并没有比较完美的解法,要么时间复杂度高,要么空间复杂度高 * 解法1: *   遍历数组,将所有奇数前移,将所有偶数保存在队列里,并统计奇数个数 *   将队列里的偶数再放到数组中 *   时间复杂度O(n),空间复杂度O(n) * 解法2: *   用i表示第一个偶数的下标,j表示i后面第一个奇数的下标(i,j初始化都为-1) *   当找到符合的i,j时,将下标为[i,j)的值向后移一位(这个范围内都是偶数), *   将原本下标为i的偶数替换为原本下标为j的奇数 *   最坏时间复杂度为O(n),空间复杂度为O(1) *  * @author peige */public class _21_ReorderArray {    /**     * 使用解法1     */    public static void reOrderArray(int[] array) {        if(array == null || array.length == 0)             return;        LinkedList<Integer> list = new LinkedList<>();        int index = 0;        for(int val : array) {            // 奇数            if((val & 1) == 1) {                array[index++] = val;            }            else {                list.add(val);            }        }        while(index != array.length) {            array[index++] = list.removeFirst();        }    }}

测试

public static void main(String[] args) {    test1();    test2();    test3();}/** * 功能测试 */private static void test1() {    int[] array1 = {1,2,3,4,5};    _21_ReorderArray.reOrderArray(array1);    printArray(array1);    int[] array2 = {1,2,1,4,5,6,3};    _21_ReorderArray.reOrderArray(array2);    printArray(array2);}/** * 边界测试 * 1.全是偶数 * 2.全是奇数 * 3.只有一个元素 */private static void test2() {    int[] array1 = {2,2,2,2};    _21_ReorderArray.reOrderArray(array1);    printArray(array1);    int[] array2 = {3,3,3,3,3};    _21_ReorderArray.reOrderArray(array2);    printArray(array2);    int[] array3 = {1};    _21_ReorderArray.reOrderArray(array3);    printArray(array3);}/** * 极端测试 */private static void test3() {    int[] array1 = null;    _21_ReorderArray.reOrderArray(array1);    printArray(array1);    int[] array2 = new int[0];    _21_ReorderArray.reOrderArray(array2);    printArray(array2);}private static void printArray(int[] array) {    System.out.println(Arrays.toString(array));}
阅读全文
0 0
原创粉丝点击