一、题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
二、解法
2.1 方法一:最简单思路
分析:如果不考虑时间复杂度和空间复杂度,最简单的思路就是从头扫描这个数组,将奇数放到一个新的数组中,将偶数放在另一个数组中。最后把两个数组拼接到一起。以下用Python实现:
class Solution:
def reOrderArray(self, array):
# write code here
array_odd = []
array_even = []
for number in array:
if number%2==0:
array_even.append(number)
else:
array_odd.append(number)
array_odd.extend(array_even)
return array_odd
2.2 方法二:维护两个指针
分析:我们可以维护两个指针:第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面,如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数,则交换两个数字。(注意:这种思路会改变奇数(偶数)之间的相对位置)
void ReorderOddEven_1(int *pData, unsigned int length)
{
if(pData == nullptr || length == 0)
return;
int *pBegin = pData;
int *pEnd = pData + length - 1;
while(pBegin < pEnd)
{
// 向后移动pBegin,直到它指向偶数
while(pBegin < pEnd && (*pBegin & 0x1) != 0)
pBegin ++;
// 向前移动pEnd,直到它指向奇数
while(pBegin < pEnd && (*pEnd & 0x1) == 0)
pEnd --;
if(pBegin < pEnd)
{
int temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}
}