第一个思路是借助辅助空间直接先将奇数筛选下来,再筛选偶数
第二个思路是用排序中的思路,问题转视作将奇数的元素尽可能往前面移动,直至到开头或者遇到其他奇数元素(即前面的已经是奇数群体),可以插排也可以冒泡排移动元素
第三个思路是用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]<<" ";
}
京公网安备 11010502036488号