1. 牛客网上那道还有附加条件“奇数与奇数的先后次序不变,偶数与偶数的先后次序保持不变”。这里我只想到一种很low的暴力方法,就是遍历,空间复杂度为O(N),时间复杂度为O(2N)。
int pointer=0;
int[] arr_answer=array.clone();
for(int elem : arr_answer){
if(elem%2==1){
array[pointer++]=elem;
}
}
for(int elem : arr_answer){
if(elem%2==0){
array[pointer++]=elem;
}
}
当然,也可以设置指针,找到第一个偶数(指针i)后,找到偶数后的第一个奇数(指针j),然后将从i到j的数组段整体移动,空间复杂度为O(1),但是时间复杂度是O(n^2);或者简单粗暴二层循环,类似冒泡。(这个代码来自网络)
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593
来源:牛客网
for (int i = 0; i < array.size();i++)
{
for (int j = array.size() - 1; j>i;j--)
{
if (array[j] % 2 == 1 && array[j - 1]%2 == 0) //前偶后奇交换
{
swap(array[j], array[j-1]);
}
}
}
2. 如果不加这个条件,那么可以用类似快排的思路,不稳定是真的。
int tmp;
int i=0,j=array.length-1;
while(i<j){
while(array[i]%2!=0&&i<j) i++;
while(array[j]%2==0&&i<j) j--;
tmp=array[i];
array[i]=array[j];
array[j]=tmp;
i++;j--;
}
或者设置两个指针,当i指向偶数,命令j找到i之后的第一个奇数,进行交换。
int tmp;
int i=0,j=0,l=array.length-1;
while(j<l&&i<l){
while(array[i]%2==1&&i<l) i++;
j=i+1;
while(array[j]%2==0&&j<l) j++;
if(i<j&&j<l){
tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
i++;
}