牛客网的一道题
题目
调整数组顺序使奇数位于偶数前面
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
第一种方法:辅助数组
创建两个新的数组 jarray 与 oarray 分别存储数组中的奇数与偶数,最后再将两个数组按照奇数在前,偶数在后合并起来。
//第一种方法
//新建两个数组,一个存放奇数一个存放偶数,最后合并
public void reOrderArray(int [] array) {
//创建两个辅助数组
int[] jarray = new int[array.length];
int[] oarray = new int[array.length];
//记录奇数与偶数的个数
int jnew = 0;
int onew = 0;
//遍历数组,将奇数与偶数分别存储到两个数组中
for (int i = 0; i < array.length;i++){
if (array[i] % 2 == 0){
oarray[onew] = array[i];
onew++;
}else{
jarray[jnew] = array[i];
jnew++;
}
}
//将奇数数组 jarray 中的元素添加到原数组
for (int j = 0;j < jnew;j++){
array[j] = jarray[j];
}
//将偶数数组 oarray 中的元素添加到原数组奇数的后面
for (int o = 0;o < onew;o++){
array[jnew + o] = oarray[o];
}
}
第二种方法:双指针法
指针 o 指向从左向右第一个偶数,,指针 j 不断向后搜索
当指针 j 所指为偶数时,继续向后搜索,当指针 j 指向奇数时,从指针 o 到 j 之间的所有偶数与指针 j 指向的奇数换位置,直到指针 j 将数组搜索完毕
//第二种方法
//双指针法
//指针o 指向从左向右第一个偶数,,指针j 不断向后搜索
//当指针j所指为偶数时,继续向后搜索,当指针j指向奇数时,从指针o到j之间的所有偶数与指针j指向的奇数换位置,直到指针j将数组搜索完毕
public void reOrderArray(int [] array) {
//定义两个指针引用
int o = 0;
int j = 0;
// j 搜索完整个数组时停止
while(j < array.length){
//如果 j 指向奇数,,将 o (包括o)到 j 之间的偶数向后移动
//将 j 指向的奇数 放到 o 处
if (array[j] % 2 != 0){
for (int i = j;i > o;i--){
int temp = array[i];
array[i] = array[i-1];
array[i-1] = temp;
}
o++;
j++;
}else{ // j 指向奇数时,跳过继续向后搜寻
j++;;
}
}
}