题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
**1、暴力解法:**从前到位扫描数组,如果出现前面是偶数后面是奇数的情况,则交换。其中使用冒泡排序的思想。从后面朝前比较,使用外循环控制趟数。
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(array.size() == 0)
return;
for(int i = 0; i < array.size(); i++)
{
for(int j = array.size()-1; j > i; j--)
if((array[j]&0x1)==1 && (array[j-1]&0x1) == 0)
swap(array[j], array[j-1]);
}
}
};
解法2
使用另外一块数组空间来存储偶数的数组,同时删除偶数在原来数组中占有的空间。最后将偶数数组添加在原数组后面即可。
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(array.size() == 0)
return;
vector<int> even;
for(vector<int>::iterator i = array.begin(); i != array.end();)
{
if((*i & 0x1) == 0)
{
even.push_back(*i);
i = array.erase(i);
}
else
i++;
}
for(int i = 0; i < even.size(); i++)
{
array.push_back(even[i]);
}
}
};
注意
剑指offer书中并没有要求偶数顺序不变,所以采用两个指针进行运算,但此算法是不稳定的。思想还是需要掌握的。
Python解法
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
'''
even = 0
odd = len(array)-1
while even < odd:
while array[even]%2 == 1:
even += 1
while array[odd]%2 == 0:
odd -= 1
if even < odd:
array[even], array[odd] = array[odd], array[even]
return array
'''
even, odd = [], []
for i in range(len(array)):
if array[i]%2 == 0:
even.append(array[i])
else:
odd.append(array[i])
return odd + even