输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> arr1,arr2;
for(int i=0;i<array.size();i++)
{
if(array[i]%2!=0)
{
arr1.push_back(array[i]);
}
else
arr2.push_back(array[i]);
}
for(int i=0;i<arr1.size();i++)
array[i]=arr1[i];
for(int i=0;i<arr2.size();i++)
array[arr1.size()+i]=arr2[i];
}
};
时间复杂度O(n),空间复杂度O(n)
方法二:
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(array.empty())
return;
int n=array.size();
for(int i=0;i<n;i++)
{
if(array[i]%2==0)//找到第一个偶数
{
for(int j=i+1;j<n;j++)
{
if(array[j]%2==1)//找到偶数后第一个奇数的位置
{
int temp=array[j];
while(j>i)
{
array[j]=array[j-1];
j--;
}
array[j]=temp;
i++;
}
}
}
}
}
};
——————————————————————————————————
如果不要求奇数和奇数,偶数和偶数之间的相对位置不变。可以这样做:
两个指针i,j,一个从前遍历,一个从后遍历。前边的如果是奇数就后移,后边的如果是偶数就前移,不是的话就交换。
时间复杂度O(n)
class Solution {
public:
void reOrderArray(vector<int> &array) {
int i=0;
int j=array.size()-1;
while(i<j)
{
while(i<j&&array[i]%2==1)//是奇数后移
i++;
while(i<j&&array[j]%2==0)//是偶数前移
j--;
if(i<j)
{
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
};
判断奇偶数可以用位运算。
与0x1相与,奇数的话为1,偶数的话为0