剑指offer:调整数组顺序使奇数位于偶数前面

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

我的思路(从繁到简):

(1)新建两个数组A、B,遍历原数组,奇数存到A,偶数存到B,最后把AB合在一起即可。

(2)新建一个数组A:①遍历原数组,先把原数组中的奇数存到A中,再遍历一次,把原数组的偶数存在A中,输出新数组;②遍历原数组,保留奇数,将偶数存到新建的数组A,最后把数组A合到原数组,再输出。

(3)不新建数组,使用指针用来交换前后两个元素。(第三个方法是剑指offer的方法,但不符合题目相对位置不变的要求。)

(4)除此之外还百度到一个新的更简单的方法:创建双向队列,遍历数组,奇数前插入,偶数后插入。最后使用assign方法实现不同容器但相容的类型赋值(参考链接:http://cuijiahua.com/blog/2017/11/basis_13.html)

针对思路2的编程实现:(3ms 512K)

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> result;
        result = array;
        int num = array.size();
        int j = 0;
        for(int i=0;i<num;i++){
            if(array[i]%2==1 && j < num){
                result[j++] = array[i];
            }
        }
        for(int m = 0;m<num;m++){
            if(array[m]%2==0 && j<num){
                result[j++] = array[m];
            }
        }
        array = result;
    }
};
针对思路4的编程实现:(4ms 480K)
class Solution {
public:
    void reOrderArray(vector<int> &array) {
        deque<int> result;
        int num = array.size();
        for(int i=0;i<num;i++){
            if(array[num - i - 1]%2==1){
                result.push_front(array[num - i - 1]);
            }
            if(array[i] %2 == 0){
                result.push_back(array[i]);
            }
        }
        array.assign(result.begin(),result.end());
    }
};

猜你喜欢

转载自blog.csdn.net/baidu_32936911/article/details/80057027