【剑指Offer】【数组】调整数组顺序使奇数位于偶数前

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

 

A1: 从头到尾扫描数字,若为偶数则移到数组的尾端

A2:双指针,起始指针向后找偶数,尾部指针向前找奇数,当start > end时停止扫描   ===> 不稳定,会改变数组顺序,案例不通过

A3:从头到尾扫描奇数,保存到新创建的数组中,再从头到尾扫描偶数,保存到新创建的数组中  ===>  感觉时间复杂度会比较大,空间复杂度也会比较大

 

//从头到尾扫描,遇到偶数则移到数组尾

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if(array.empty())
        {
            return;
        }
        vector<int>::iterator it = array.begin();
        for(int i = 0; i < array.size(); i++)
        {
            if((*it & 0x1) == 0)
            {
                int tmp = *it;
                array.erase(it);
                array.push_back(tmp);
            }
            else
            {
                it++;
            }
        }
    }
};

 

//双指针,交换前面的偶数和后面的奇数

不符合测试用例

 

//扫描两边数组

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if(array.empty())
        {
            return;
        }
        vector<int> tmp;
        for(int i = 0; i < array.size(); i++)
        {
            if((array[i] & 0x1) != 0)
            {
                tmp.push_back(array[i]);
            }
        }
        for(int i = 0; i < array.size(); i++)
        {
            if((array[i] & 0x1) == 0)
            {
                tmp.push_back(array[i]);
            }
        }
        array = tmp;
    }
};

  

  

 

 

 相关题目:

  数组操作:输入一个无序整数数组,调整数组中数字的顺序, 所有偶数位于数组的前半部分,使得所有奇数位于数组的后半部分。要求时间复杂度为O(n)。

  回文数组:对于一个给定的正整数组成的数组 a[] ,如果将 a 倒序后数字的排列与 a 完全相同,我们称这个数组为“回文”的。例如, [1, 2, 3, 2, 1] 的倒序是他自己,所以是一个回文的数组;而 [1, 2, 3, 1, 2] 的倒序是 [2, 1, 3, 2, 1] ,所以不是一个回文的数组。对于任意一个正整数数组,如果我们向其中某些特定的位置插入一些正整数,那么我们总是能构造出一个回文的数组。

  中位数:小M给你一个长度为n的数组,我们定义median数为该数组从小到大排序后,下标为(n-1)/2的数字。下标从0开始,(n-1)/2表示整数除法,即向下取整。现在我们已经得到了一个初始的数组,我们希望这个数组的median数是一个给定数字x。所以我们需要加入一些数到数组中从而完成我们的目标。数组中的元素可以重复,请问,最少需要加入多少个数字才能达成这个目标。

 

posted @ 2019-08-28 14:43  XieXinBei0318  阅读(222)  评论(0编辑  收藏  举报