[nowcoder] 调整数组顺序使奇数位于偶数前面

题目描述

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

思路

题目要求不改变调整前后奇偶元素之间的相对位置。所以可以借鉴冒泡的思路。
即:当遍历到元素x为偶数时,将其调整到数组最后一位,此时,需要判断原数组x之后的一个数的奇偶情况,如果该数为偶数,则继续调整这个数,如果该数为奇数则跳过该数判断下一个元素。
class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if (array.empty())
            return;
        int n = array.size();
        int tmp = 0;
        for (int i = 0; i < n-tmp; )
        {
            if (array[i] % 2 == 0)
            {
                for (int j = i+1; j < n; ++j)
                {
                    swap(array[j], array[j-1]);
                }
                tmp++;
            }
            if (array[i] % 2 != 0)
                i++;
        }
    }
};

 同上利用冒泡排序,该思路交换次数较少,从后向前遍历,如果j-1为偶,j为奇,则交换,否则跳过。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if (array.empty())
            return;
        int n = array.size();
        for (int i = 0; i < n; ++i)
        {
            for (int j = n-1; j > i; --j)
            {
                if (array[j-1] % 2 == 0 && array[j] % 2 != 0)
                    swap(array[j-1], array[j]);
            }
        }
    }
};

利用vector临时数组来存储偶数值,遍历时找出偶数后并删除放入临时数组中,遍历结束后然后将临时数组中元素放入原数组的尾部。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if (array.empty())
            return;
        vector<int> tmp;
        for (auto it = array.begin(); it != array.end(); ++it)
        {
            if (*it % 2 == 0)
            {
                tmp.push_back(*it);
                it = array.erase(it);
                it--;
            }
        }
        for (auto it = tmp.begin(); it != tmp.end(); ++it)
            array.push_back(*it);
    }
};

猜你喜欢

转载自www.cnblogs.com/immjc/p/9162539.html
今日推荐