调整数组使奇数位于偶数前面

一、题目描述

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

题目来源:调整数组使奇数位于偶数前面

二、题目解析

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        /**
         * 说实话,拿到这道题,我的第一想法是用快排的思想
         * 可是转念一想,又不对
         * 2, 7, 8, 9, 3, 6, 5, 1, 4, 0
         *    ·!                           !
         * 2, 0, 8, 9, 3, 6, 5, 1, 4, 7
         * 之后就不写了吧,很明显,偶数与偶数之间的相对位置已经改变
         * 2, 8, 6, 4, 0, 7, 9, 3, 5, 1 <- 这是理论上的值
         * 所以我们第一个办法呢,可以借助辅助空间嘛
         */
#if 1
        if (array.empty())
        {
            // 数组为空 直接返回吧
            return;
        }
        std::vector<int> temp(array.size());
        // 遍历一遍数组,统计奇数的个数
        int count = 0;
        for (auto it : array)
        {
            if (it % 2 == 1)
            {
                ++count;
            }
        }
        // 奇数开始存储的下标
        int en = 0;
        // 偶数开始存储的下标
        int old = 0 + count;
        for (auto it : array)
        {
            if (it % 2 == 1)
            {
                temp[en++] = it;
            }
            else
            {
                temp[old++] = it;
            }
        }
        
        std::swap(temp, array);
#endif 
        /**
         * 这样的话,时间复杂度为 O(n) 可是空间复杂度也是 O(n)
         * 面试的时候,面试官极有可能让你写出 时间为 O(n) 空间为O(1)的算法
         * 所以我们再考虑一下,有没有优化的策略
         * 我们再想想快排的实现吧,快排有很多版本,但是思想都是一样的,只是实现的方式不同
         * 最开始我们发现,一头一尾指针,没办法解决这个问题,那我们考虑一下以前一后指针是否可以实现
         * 
         * 经过尝试,也是不行的,它会改变奇偶相对顺序
         * 
         * 我没有想到 时间为 O(n) 空间为 O(1) 的解法
         */
    }
};

如有问题欢迎评论区指出,谢谢大家:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值