Java面试题 给定一个数组,将数组里的偶数要在奇数前面,要求时间复杂度位O(n)

给定一个数组,将数组里的偶数要在奇数前面,要求时间复杂度位O(n)
例如: 输入 data = { 1 ,2 ,3 ,4,5,6,7,8,9,0,13}
输出 data={0,2,8,4,6,5,7,3,9,1,13}

备注:仔细观察输入和输出,仅仅是将前面的奇数和后面的偶数交换相对位置,
思路就是,从前往后找奇数,从后往前找偶数,将找到的第一个奇数和偶数进行位置交换,依次向中间查找,直到前面的索引大于等于后面的索引为止。

1、时间复杂度为O(n),空间复杂度为O(1)

    /**
     * 使用while的方式
     * 时间复杂度为O(n),空间复杂度为O(1)
     *
     * @param data
     * @return
     */
    public int[] useWhileOn(int[] data) {
   
   

        // 头索引
        int headIndex = 0;
        // 尾索引
        int tailIndex = data.length - 1;

        // 从头到尾
        while (headIndex < tailIndex ) {
   
   
            // 找到前面奇数索引时
            if (isOddNumber(data[headIndex])) {
   
   
                // 找到后面偶数索引时
                if (isEvenNumber(data[tailIndex])) {
   
   
                    // 奇偶交换位置,前后交互位置
                    swap(data, headIndex, tailIndex);
                    headIndex++;
                }
                // 直到找到偶数索引
                tailIndex--;
            } else {
   
   
                // 直到找到奇数索引
                headIndex++;
            }
        }

        return data;
    }
    /**
     * 使用for的方式
     * 时间复杂度为O(n),空间复杂度为O(1)
     *
     * @param data
     * @return
     */
    public int[] useForOn(int[] data) {
   
   

        int headIndex = 0;
        int tailIndex = data.length - 1;

        for (; headIndex < tailIndex; ) {
   
   
            // 找到前面奇数索引时
            if (isOddNumber(data[headIndex])) {
   
   
                // 找到后面偶数索引时
                if (isEvenNumber(data[tailIndex])) {
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值