剑指Offer-调整数组顺序使奇数位于偶数前面

题目描述

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

解题思路

一开始把题目看错了,没有看到要求相对位置不变,因此使用了类似于快排的方法来做(这个也应该是一个可能的考点)。由于要求相对位置不变,我的想法很简单,将奇数和偶数分别按顺序存储在两个vector中,再修改原始vector数组中的数字,但这样就占用了存储空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> a1;
vector<int> a2;
for(int i=0; i<array.size(); i++){
if(array[i] % 2 != 0){ //奇数
a1.push_back(array[i]);
}
else a2.push_back(array[i]);
}
for(int i=0; i<a1.size(); i++){
array[i] = a1[i];
}
for(int i=a1.size(); i<array.size(); i++){
int j = i-a1.size();
array[i] = a2[j];
}
}
};

在牛客网上看到一个短小精悍的代码,有点类似冒泡排序。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
void reOrderArray(vector<int> &array) {
for(int i=0; i<array.size(); i++){
for(int j=array.size()-1; j>i; j--){
if(array[j]%2==1 && array[j-1]%2==0)
swap(array[j], array[j-1]);
}
}
}
};

多学学!!同时,尽量熟悉使用vector来答题。