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

输入一整数数组,调整数组中数字的顺序,使奇数位于数组的前半部分,偶数位于数组的后半部分

两个指针A, B. A指向开始 B指向结束。

向中间移动指针,当A指向偶数, B指向奇数时,交换位置。

当 A > B时,表示已经结束,得到移动后的数组

public static void reorder(int[] num) {
    if (num == null || num.length < 2) {
        return;
    }

    int left = 0;
    int right = num.length - 1;
    while (left < right) {
        if ((num[left] & 1) == 0 && (num[right] & 1) == 1) {  //左边偶数,右边奇数
            swap(num, left++, right--);
        } else if ((num[left] & 1) == 0) {  //左边偶数, 右边偶数
            right--;
        } else if ((num[right] & 1) == 1) { //右边奇数,左边奇数
            left++;
        } else {
            left++;
            right--;
        }
    }
}

如果要求奇数偶数保持原来顺序, 可以用一个辅助数组,统计出奇数的数量k,遍历数组,奇数从0开始存入,偶数从k开始存储

public static void reorder(int[] num) {
    if (num == null || num.length < 2) {
        return;
    }

    int k = 0;
    for (int val : num) {
        if ((val&1) == 1)
            k++;
    }
    int[] copy = num.clone();
    int i = 0;
    for (int val : copy) {
        if ((val & 1) == 1) {
            num[i++] = val;
        } else {
            num[k++] = val;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41889284/article/details/89418026
今日推荐