题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变(加粗部分在原书上没有,但在牛客网在线OJ系统上存在)。
分析
若是在牛客网上刷题,直接开两个数组,一个保存奇数,另一个保存偶数,遍历原数组把奇数和偶数分开就行。
不加上述加粗的条件的思路如下:指定两个指针low和high,分别指向第一个和最后一个元素,在low小于high的前提下,寻找到前半部分的第一个偶数和后半部分第一个奇数,然后对调即可,重复上述直至low等于high。
github链接:JZ13-调整数组顺序使奇数位于偶数前面
C++ 代码
1.牛客网刷题
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
if(len == 0){
return;
}
vector<int> even;
vector<int> odd;
for(int i = 0 ; i < len ; i++){
if(array[i] % 2 == 0){
even.push_back(array[i]);
}else{
odd.push_back(array[i]);
}
}
int cnt = 0;
for(int i = 0 ; i < odd.size() ; i++){
array[cnt++] = odd[i];
}
for(int i = 0 ; i < even.size() ; i++){
array[cnt++] = even[i];
}
}
};
int main(){
int n;
while(cin>>n){
vector<int> array(n);
for(int i = 0 ; i < n ; i++){
cin>>array[i];
}
Solution s;
s.reOrderArray(array);
for(int i = 0 ; i < array.size() ; i++){
cout<<array[i]<<" ";
}
}
return 0;
}
2 原书思路
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void reOrderArray(vector<int> &array) {
int size = array.size();
int low = 0;
int high = size - 1;
while(low < high){
while(low < high && !this->isEven(array[low])){ //从前到后找到偶数
low++;
}
while(low < high && this->isEven(array[high])){ //从后往前找奇数
high--;
}
if(low < high){
array[low] += array[high];
array[high] = array[low] - array[high];
array[low] -= array[high];
}
}
}
bool isEven(int n){
return (n & 0x1) == 0;
}
};
int main(){
int n;
while(cin>>n){
vector<int> array(n);
for(int i = 0 ; i < n ; i++){
cin>>array[i];
}
Solution s;
s.reOrderArray(array);
for(int i = 0 ; i < array.size() ; i++){
cout<<array[i]<<" ";
}
}
return 0;
}