题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题目分析
如果可以开辟新的数组,非常简单。
例如:
class Solution
{
public:
void reOrderArray(vector<int> &array)
{
vector<int> odd; //奇数
vector<int> even; //偶数
for (int i = 0; i < array.size(); i++)
{
if (array[i] % 2)
odd.push_back(array[i]);
else
even.push_back(array[i]);
}
array.clear();
for (int i = 0; i < odd.size(); i++)
array.push_back(odd[i]);
for (int i = 0; i < even.size(); i++)
array.push_back(even[i]);
}
};
如果不可以开辟新的数组,可以使用如下策略:
使用变量index
记录插入位置,初始值为0.遍历原数组,如果为奇数,则将[index, i-1]
的数据都向右移动一个单位。然后将数据插入到位置index
中。令index++
class Solution
{
public:
void reOrderArray(vector<int> &array)
{
int temp, index = 0;
for (int i = 0; i < array.size(); i++)
{
if (array[i] % 2)
{
temp = array[i];
for (int j = i; j > index; j--)
array[j] = array[j - 1];
array[index++] = temp;
}
}
}
};
时间复杂度为O(n^2)
By The Way
判断奇偶性除了可以用n % 2
,还可以用n & 1
Java
public class Solution {
public void reOrderArray(int[] array) {
int index = 0, temp;
for (int i = 0; i < array.length; i++) {
if ((array[i] & 1) == 1) {
temp = array[i];
for (int j = i; j > index; j--)
array[j] = array[j - 1];
array[index++] = temp;
}
}
}
}