刷题打卡 | 剑指Offer之调整数组顺序使得奇数在偶数前面

84 阅读2分钟

剑指Offer💨问题13:调整数组顺序使得奇数在偶数前面

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

问题描述

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

解题思路

  思路一:暴力求解。这题其实可以直接通过暴力求解的方式进行求解,新建一个数组,然后从当前数组中挨个找奇数,然后再挨个找偶数,这样既可以实现奇数再偶数前面,又可以实现相对位置不变。

  思路二:对数组进行遍历,设置两个指针even和odd,even指向当前第一个偶数,odd从这个偶数之后开始查找,找到第一个奇数,此时为了相对位置不变,不能直接交换even和odd,而是将从even到odd-1的元素都依次向后移一个位置,将odd指向的那个奇数放到even的位置。然后再找下一个偶数,重复这一过程,最终就可以将奇数都放到偶数的前面,并且保证了相对位置的不变。

求解

  一般求解之前都会执行判断数组是否为空等操作,这边就不再单独说了。直接进行求解

    public static void reOrderArray(int[]  tempArray){
        int even = 0, odd = 0;

        while (even < tempArray.length && odd < tempArray.length){
            //查询第一个偶数
            while (even < tempArray.length && tempArray[even] % 2 != 0){
                even++;
            }
            odd = even + 1;

            // 查询偶数后的第一个奇数
            while (odd < tempArray.length && tempArray[odd] % 2 == 0){
                odd++;
            }

            // 判断 odd 是否出界
            if (odd >= tempArray.length){
                break;
            }

            // 将 even 与 odd 之间的数据整体后移,然后交换 even 与 odd 的数据
            int temp = tempArray[odd];
            for (int k = odd - 1; k >= even; k--){
                tempArray[k + 1] = tempArray[k];
            }
            tempArray[even] = temp;
            even++;
        }

    }

完整代码

    public static void reOrderArray(int[]  tempArray){
        int even = 0, odd = 0;

        while (even < tempArray.length && odd < tempArray.length){
            //查询第一个偶数
            while (even < tempArray.length && tempArray[even] % 2 != 0){
                even++;
            }
            odd = even + 1;

            // 查询偶数后的第一个奇数
            while (odd < tempArray.length && tempArray[odd] % 2 == 0){
                odd++;
            }

            // 判断 odd 是否出界
            if (odd >= tempArray.length){
                break;
            }

            // 将 even 与 odd 之间的数据整体后移,然后交换 even 与 odd 的数据
            int temp = tempArray[odd];
            for (int k = odd - 1; k >= even; k--){
                tempArray[k + 1] = tempArray[k];
            }
            tempArray[even] = temp;
            even++;
        }

    }

    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};

        //输出的数组结果
        for(int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println(" ");
        reOrderArray(array);

        //输出调整后的数组结果
        for(int i=0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
    }

结果展示

01.png