剑指Offer——(13)调整数组顺序使奇数位于偶数前面

来源:互联网 发布:如何淘宝买东西 编辑:程序博客网 时间:2024/06/05 02:09

题目描述:

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

实现如下:

//很奇怪,竟然加了“保证奇数和奇数,偶数和偶数之间的相对位置不变。”这个条件→_→//如果加了这个条件,目前想到的是开辟一个新的vector从array中遍历//第一次遍历,将奇数push,第二次遍历再将偶数pushclass Solution {public:    void reOrderArray(vector<int> &array)    {        vector<int> res;        for (int i = 0; i < array.size(); ++i)//array为空直接跳出        {            if (array[i] & 0x1)                res.push_back(array[i]);        }        for (int i = 0; i < array.size(); i++)//array为空直接跳出        {            if (array[i] % 2 == 0)                res.push_back(array[i]);        }        array = res;    }};//如果不考虑“保证奇数和奇数,偶数和偶数之间的相对位置不变。”这个条件//维护两个指针/迭代器,itp寻找下一个最近的偶数,its寻找前一个最近的奇数//当itp > its时,说明全部奇数都在偶数前面//特殊情况://当its - itp == 1时,不需要再交换//全部为奇数//全部为偶数class Solution {public:    void reOrderArray(vector<int> &array)     {        int size = array.size();        if (size == 0 || size == 1) return;//为空或只有一个元素时        vector<int>::iterator itp = array.begin();        vector<int>::iterator its = array.end() - 1;        int tmp = 0;        while (itp < its)//保证还有数字未调整        {            //寻找下一个偶数,            while (itp != array.end() - 1 && *itp & 0x1) ++itp;            //寻找下一个奇数            while (its != array.begin() && !(*its & 0x1)) --its;            //判断是否itp剩下的全为奇数或its剩下的全为偶数            if (itp == array.end() || its == array.begin()) break;            else if(itp < its)//保证非its - itp == 1的情况            {                tmp = *itp;                *itp = *its;                *its = tmp;            }        }    }};
0 0