题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
1、看到这道题的时候,最懒的思路就是用两个队列分别缓存奇数和偶数,等扫描完毕之后再循环赋值回去,可惜的是这样做需要的空间受到限制;
2、出题者原意肯定是希望解题者在原数组上进行操作,而不借助额外的数据结构。
3、我的解题思路是:
申请两个指针i、j;
i指向第一个偶数所在位置,j指向第一个奇数所在位置,对两者进行交换,交换之后为了保证偶数的相对位置不要发生变化,还需对i~j之间的偶数进行右移,具体怎么看代码吧。
整个处理过程是很清晰的,就是大家在做题的时候需要对边界条件的处理要细心。
class Solution {
public:
void reOrderArray(vector<int> &array) {
if (array.size() == 0 || array.size() == 1)
{
return;
}
int i = 0;
int j = 0;
while (i < array.size())
{
if (array[i] % 2 != 0)
{
i++;
}
else
{
j = i + 1;
if (j == array.size())
{
break;
}
while (j < array.size())
{
if (array[j] % 2 != 0)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
break;
}
else
{
j++;
}
}
}
if (j == array.size())
{
break;
}
while (i < j)
{
int t = array[j-1];
array[j - 1] = array[j];
array[j] = t;
j--;
}
}
}
};