剑指offer java NO15

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

思考:定义两个指针,分别指向数组的头(start)和尾(end)。如果头指针指向的是奇数,则后移一位,尾指针指向的是偶数,则前移一位。当头指针指向的是偶数且尾指针指向的是奇数的时候,头尾指向的值互换。循环条件:start < end
特殊情况:
1. 数组的长度 < 2,抛出异常。
2. 指针移动之后头指针可能与尾指针重叠或者在尾指针后面

/**
 * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
 * 使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
 */
public class NO15 {
    public static void main(String[] args) {
        int[] arr = {1,2};
        NO15A no15A = new NO15A();
        no15A.printArray(arr);
        System.out.println();
        no15A.reOrderOddAndEven(arr);
        no15A.printArray(arr);
    }
}

class NO15A{
    //排序函数
    public void reOrderOddAndEven(int[] arr){
        int arrLength = arr.length;
        //如果数组的长度 < 2
        if (arrLength < 2){
            throw new RuntimeException("数组长度最少为2!");
        }
        int start = 0;
        int end = arrLength - 1;
        while (start < end){
            while (arr[start] % 2 != 0){
                start++;
            }
            while (arr[end] % 2 == 0){
                end--;
            }
            /*移动之后的头尾指针有可能重叠或者头指针超过尾指针,此时直接退出循环,不可以进行值的交换*/
            if (start >= end){
                break;
            }
            if (arr[start] % 2 == 0 && arr[end] % 2 != 0){
                int temp = arr[end];
                arr[end] = arr[start];
                arr[start] = temp;
            }
        }
    }
    //数组打印函数
    public void printArray(int[] arr){
        for(int a : arr){
            System.out.print(a + " ");
        }
    }
}

运行结果:

1 2 3 4 5 6 7 8 
1 7 3 4 5 6 2 8 
Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/TaylorSwift_1989/article/details/89331493