【题目描述】
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。(这与剑指offer书中有所不同,书中没要求保持相对位置不变)
【思路】
【1】如果没有要求保持相对位置不变的话,就比较简单。通过双指针,p1从前向后遍历找偶数,p2从后向前遍历找奇数,一旦找到就交换二者位置。相当于while循环中,再执行两个while循环。时间复杂度O(n).
【2】要求保持相对位置不变的话,就新建一个长度相同的数组re用于保存结果。在两个数组上都是用双指针。详见代码.
【代码】
C++:
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> re=array;
int left=0;
int len=array.size();
int right=len-1;
for(int arr_left=0;arr_left<len;arr_left++){
int arr_right=len-1-arr_left;
if(array[arr_left]%2==1){
re[left]=array[arr_left];
left+=1;
}
if(array[arr_right]%2==0){
re[right]=array[arr_right];
right-=1;
}
}
array=re;
}
};
Python:
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
re=[0 for _ in range(len(array))]
re_left=0
re_right=len(re)-1
for arr_left in range(len(re)):
arr_right=len(re)-1-arr_left
if(array[arr_left]%2==1):
re[re_left]=array[arr_left]
re_left+=1
if(array[arr_right]%2==0):
re[re_right]=array[arr_right]
re_right-=1
return re