调整数组顺序使奇数位于偶数前面
考点:数组
题目描述
输入一个整数数组,实现一个函数来调整数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
格式要求
public class Solution{
punlic void reOrderArray(int[] Array){
}
}
解题一-移动数组元素
1.思路
参考快速排序
i++
往前走碰到偶数停下来,j = i+1
- 若
a[j]
为偶数,j++
前进,直到碰到奇数a[j]
对应的奇数插到a[i]位置,j
经过的j-i
个偶数依次后移- 如果
j==len-1
时还没碰到奇数,证明i
和j
之间都为偶数了,完成整个移动

这道题就是将数组分为奇数部分和偶数部分,每遍历到一个奇数,就迭代地将其放入前面奇数部分,每遍历到一个偶数,就继续遍历。
相当于任意奇数都小于任意偶数,所有奇数都相等,所有偶数都相等,然后使用快速排序排序数组。
2.代码
public class Solution {
public void reOrderArray(int [] array) {
if(array==null||array.length==0){
return;
}
for(int i=0;i<array.length;i++){
// 如果当前元素是奇数,就移动到奇数序列
if((Math.abs(array[i]))%2!=0){
int temp=array[i];
int cur = i;
while(cur > 0 && (array[cur - 1] % 2 == 0)){
array[cur] = array[cur - 1];
cur--;
}
array[cur]=temp;
}
// 否则当前元素是偶数,无需移动
}
}
}
解题二-使用两个队列
1.思路
使用两个队列,一个存奇数,一个存偶数,然后依次将数赋值回原数组
2.代码
public class Solution {
public void reOrderArray(int [] array) {
if(array==null||array.length==0){
return;
}
Queue<Integer> oddQueue=new LinkedList<>();
Queue<Integer> evenQueue=new LinkedList<>();
for(int i=0;i<array.length;i++){
if(isOddNum(array[i])){
oddQueue.offer(array[i]);
}else {
evenQueue.offer(array[i]);
}
}
int i=0;
while(!oddQueue.isEmpty()){
array[i++]=oddQueue.poll();
}
while(!evenQueue.isEmpty()){
array[i++]=evenQueue.poll;
}
}
private static boolean isOddNum(int num){
if((num&1)==1){
return true;
}
return false;
}
}
注:Solution.java:6: error: cannot find symbol
Queue oddQueue=new LinkedList<>();
^
网友评论