调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
这道题我看解析中的人也没什么太好的解法。觉得自己这个方法还行。时间复杂度和空间复杂度都是O(n)的。就是新建一个数组,长度是原来的二倍,奇数放前面,偶数放后面,然后再写回原数组中
public class Solution {
public void reOrderArray(int [] array) {
Integer length=array.length;
if(length<1)
return;
int[] temp=new int[2*length];
Integer withinIndex=0;
Integer outSideIndex=length;
for(int i:array){
if(i%2==0){
temp[outSideIndex]=i;
outSideIndex++;
}else{
temp[withinIndex]=i;
withinIndex++;
}
}
Integer index=0;
for(int i=0;i<withinIndex;i++){
array[index]=temp[i];
index++;
}
for(int i=length;i<outSideIndex;i++){
array[index]=temp[i];
index++;
}
}
}
这道题没什么需要注意的.
此外,也可以不使用长度为二倍的数组,而是两个链表:
import java.util.LinkedList;
import java.util.Iterator;
public class Solution {
public void reOrderArray(int [] array) {
//奇队列
LinkedList<Integer>odds=new LinkedList<>();
//偶队列
LinkedList<Integer>evens=new LinkedList<>();
for(int i=0;i<array.length;i++){
if(array[i]%2==1){
odds.add(array[i]);
}else{
evens.add(array[i]);
}
}
Iterator<Integer>oddIterator=odds.iterator();
Iterator<Integer>evensIterator=evens.iterator();
int index=0;
while(oddIterator.hasNext()){
array[index]=oddIterator.next();
index++;
}
while(evensIterator.hasNext()){
array[index]=evensIterator.next();
index++;
}
return;
}
}
另外,这道题我之后再写的时候,想了下面这样的算法:
public class Solution {
public void reOrderArray(int [] array) {
int left=0,right=array.length-1;
while(left<right){
while(array[left]%2==1){
left++;
}
if(left>=right){
break;
}
while(array[right]%2==0){
right--;
}
if(left>=right){
break;
}
int temp=array[left];
array[left]=array[right];
array[right]=temp;
}
return;
}
}
一次循环就能完成任务,但是不能保证奇偶相对位置不变,所以pass

浙公网安备 33010602011771号