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

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

http://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593

第一个思路是借助辅助空间直接先将奇数筛选下来,再筛选偶数
第二个思路是用排序中的思路,问题转视作将奇数的元素尽可能往前面移动,直至到开头或者遇到其他奇数元素(即前面的已经是奇数群体),可以插排也可以冒泡排移动元素
第三个思路是用vector动态调整将偶数都取出然后尾插

#include <iostream>
#include <vector>
using namespace std;
class Solution { //辅助空间
public:
    void reOrderArray(vector<int> &array) {
        vector<int> v;
        for(auto it:array){
            if((it)%2 != 0){
                v.push_back(it);
            }
        }
        for(auto it:array){
            if((it)%2 == 0){
                v.push_back(it);
            }
        }
        for(int i=0;i<array.size();++i){
            array[i] = v[i];
        }
        return ;
    }
};
class Solution2 { //借鉴插入排序,奇数往前部移直至遇到奇数停止
public:
    void reOrderArray(vector<int> &array) {
       for(int i=0;i<array.size();++i){
           if(array[i]%2!=0){
               int j=i-1;
               int tempt=array[i];
               while((j>=0)&&(array[j]%2==0)){
                   array[j+1]=array[j];
                   j--;
               }
               array[j+1] = tempt;
           }
       }
    }
};

vector有两个注意的:
1.动态调整vector还要遍历,变量不能按vector的元素遍历,可能死循环也可能访问非法(调整后it的指向未知并不一定顺延下去),自己手动技术size次。
2.先察除(当然要先存好副本),再插入而不能先插入副本再删除(估计是插入的时候vector就变了it指向也变了),同时得用it=v.erase(it)(无法解释为什么先删除再插入删除的返回it还能用,反正是实测踩坑)

class Solution3 { //vector偶数动态倒插法
public:
    void reOrderArray(vector<int> &array) {
        vector<int>::iterator it = array.begin();
        for(int i=0;i<array.size();++i){
            if(*it%2==0){
                int tempt = *it;
                it = array.erase(it);             //顺序反了就不行????
                array.push_back(tempt);
            }else{
                it++;                            //记得没成功的也有指针后移
            }
        }
    }
};
int main(){
    vector<int> v={1, 2,3,4, 5, 6, 7};
    Solution3 s;
    s.reOrderArray(v);
    for(int i=0;i<v.size();++i)
        cout<<v[i]<<" ";

}
全部评论

相关推荐

12-13 12:11
复旦大学 Java
点赞 评论 收藏
分享
头像
10-27 15:50
门头沟学院 Java
想进开水团喝开水:有一种店 只能外卖 不能堂食 你猜为什么
点赞 评论 收藏
分享
给🐭🐭个面试机会...:我擦seed✌🏻
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务