剑指offer(Java版):调整数组顺序使奇数位于偶数的前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部奇数位于数组的前半部分,全部偶数位于数组的后半部分。程序员

一、基本实现: 面试

若是不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的全部的数字往前面挪动一位。 挪完以后在数组的末尾有一个空位,这时把该偶数放入这个空位。因为没碰到一个偶数就须要移动O(n)个数字,所以总的时间复杂度是O(n2).可是,这种 方法不能让面试官满意。不过若是咱们在听到题目以后立刻可以说出这个解法,面试官至少会以为咱们的思惟很是灵敏。数组

 

二、只完成基本功能的解法,仅适用于初级程序员函数

这个题目要求把奇数放在数组的前半部分,偶数放在数组的后半部分,所以全部的奇数应该位于偶数的前面,也就是说咱们在扫描这个数组的时候,若是发现有偶数在奇数的前面,咱们能够交换他们的数序,交换以后就符合要求了。spa

所以咱们能够维护两个指针,第一个指针初始化时指向数组的第一个数 字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它指向前移动。在两个指针相遇以前,第一个指针老是位于第二个指针的前面。若是第一个指针 的数字是偶数,而且第二个指针指向的数字是奇数,咱们就交换两个数字。指针

三、考虑可扩展性的解法,秒杀Offer开发

若是是面试应届毕业生或者工做时间不长的程序员,面试官会满意前面的代码,但若是应聘者申请的是资深的开发职位,那面试官可能会接着问几个问题。it

面试官:若是把题目改为数组中的数按照大小分为两部分,全部的负数在全部的非负数的前面,该怎么作?class

若是再把题目改改,变成 把数组中的数分红两部分,能被3整除的数都在不能被3整除的数的前面,怎么办?test

这就是面试官在考察咱们对可扩展性的理解,即但愿咱们可以给出一个模式,在这个模式下可以很方面第把已有的解决方案扩展到同类型的问题上去。

因而咱们写出下面的代码:

package cglib;


public class DeleteNode {
    public void order(int[] array)
    {
    if(array==null||array.length==0)
    return ;
    int start=0;
    int end=array.length-1;
    while(start<end){
    while(start<end&&!isEven(array[start])){
    start++;
    }
    while(start<end&&isEven(array[end])){
    end--;
    }
    if(start<end){
    int temp=array[start];
    array[start]=array[end];
    array[end]=temp;
    }
    }
    }
      
    public boolean isEven(int n){  
        return (n & 1) == 0; // (n & 1) == 0为偶数
    }  
    public static void main(String[] args){  
        DeleteNode test = new DeleteNode();  
        int[] arr= {1,2,3,4,5,6,12,7,8,9,10};  
        test.order(arr);  
        for(int item:arr)
            System.out.println(item);
    }  
}

输出:1 9 3 7 5 6 12 4 8 2 10

相关文章
相关标签/搜索