知识点/数据结构:数组
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
1:自己写的代码,借助了其他的内存空间
奇数和奇数 偶数和偶数相对位置不变 指的是奇数之间的先后顺序不变,偶数也是。
自己的做法是把奇数挑选出来 ,放在一个新的数组里边;把偶数挑选出来。放在一个新的数组里边。最后把两个信息的数组覆写带原来的数组里边。但是自己的代码太长了 不简洁。
public class Solution {
public void reOrderArray(int [] array) {
int count1=0; int count2=0;
for(int i=0;i<array.length;i++){
if(array[i]%2==1){
count1++;
}
}
count2=array.length-count1;
int a[]=new int[count1];
int b[]=new int[count2];
int m=0;int n=0;
for(int i=0;i<array.length;i++){
if(array[i]%2==1){
a[m]=array[i];
m++;
}
}
for(int i=0;i<array.length;i++){
if(array[i]%2==0){
b[n]=array[i];
n++;
}
}
for(int i=0;i<a.length;i++){
array[i]=a[i];
}
for(int i=0;i<b.length;i++){
array[i+a.length]=b[i];
}
}
}
2:用了两个循环嵌套进行了遍历数组,时间复杂度为还是N(n^2),可以考虑用右移运算符代替取余运算
public class Solution{
public void reOrderArray(int array[]){
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-1-i;j++){
if((array[j]%2==0)&&(array[j+1]%2==1)){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
}
较为简洁的思路(不满足相对位置不变,下面的解法是发生变化的):我们可以维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个数字指向的数字是偶数,并且第二个数字指向的数字是奇数,则交换两个数字。
public class Solution{
public void reOrderArray(int array[]){
int a=0;
int b=array.length-1;
while(a<b){
while(a<b&&(array[a]&1)==1){
a++;
}
while(a<b&&(array[b]&1)==0){
b--;
}
if(a<b){
int temp= array[a];
array[a]=array[b];
array[b]=temp;
}
}
}
}
运行结果如下:
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%
测试用例:
[1,2,3,4,5,6,7]
对应输出应该为:
[1,3,5,7,2,4,6]
你的输出为:
[1,7,3,5,4,6,2]