调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

这道题我看解析中的人也没什么太好的解法。觉得自己这个方法还行。时间复杂度和空间复杂度都是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

posted @ 2020-03-02 09:18  别再闹了  阅读(51)  评论(0)    收藏  举报