题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
知识点
数组
思路
解法一、多开一个数组先存偶数数字,把所有奇数数字移到前面,再将偶数数字拼接到最后。
解法二、在当前数组中进行交换:
even用来存第一个偶数数字下标;
odd存需要换的奇数数字下标;
flag表示偶数下标是否已经存过,否则为false,是则为true,存过将不再存;
每次even<odd时,将odd下标的数字换到第一个even数字前,并更新下标。
代码
public class Solution {
public void reOrderArray(int [] array) {
int even=0;
for(int i=0;i<array.length;i++){
if((array[i]&1)==0){
even++;//计算偶数个数
}
}
int[] array1 = new int[even];//开个新数组存偶数
int j=0;
int odd=0;
for(int i=0;i<array.length;i++){
if((array[i]&1)==0){
array1[j]=array[i];
j++;
}else{
array[odd]=array[i];
odd++;//将奇数往前放
}
}
for(int i=0;i<array1.length;i++){
array[odd] = array1[i];//将偶数拼到奇数后面
odd++;
}
}
}
public class Solution {
public void reOrderArray(int [] array) {
int even=-1;//偶数下标
int odd=-1;//奇数下标
boolean flag = false;//是否更新过偶数下标
for(int i=0;i<array.length;i++){
if((array[i]&1)==1){
odd=i;
}else if((array[i]&1)!=1&&flag==false){
even=i;//只要存第一个偶数下标
flag=true;
}
if(even<odd&&(odd!=-1)&&(even!=-1)){
int tempt = array[odd];
for(int j=odd;j>even;j--){
array[j]=array[j-1];
}
array[even] = tempt;
odd = even;
even++;//将奇数移到第一个偶数前,第一个偶数下标++
}
}
}
}