「算法」按奇偶排序数组 & 按奇偶排序数组II

719 阅读3分钟

00905 按奇偶排序数组

题目描述

给定一个非负整数数组 A,返回一个数组,在该数组中 A 的所有偶数元素之后跟着所有奇数元素。

你可以返回满足此条件的任何数组作为答案。

示例:

输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。 

提示:

  • 1 <= A.length <= 5000
  • 0 <= A[i] <= 5000

力扣地址

解题报告

两遍扫描

本题解由微信公众号小猿刷题提供, 错误之处, 欢迎指正.

第一遍扫描输出偶数, 第二遍扫描输出奇数.

/**
 * 微信公众号"小猿刷题"
 */
class Solution {
    public int[] sortArrayByParity(int[] A) {
        int[] list = new int[A.length];
        int t = 0;
        for (int i = 0; i < A.length; i++) {
             if (A[i] % 2 == 0){
                 list[t++] = A[i];
             }
                
        }
        for (int i = 0; i < A.length; i++) {
             if (A[i] % 2 == 1){
                 list[t++] = A[i];
             }
                
        }
        return list;
    }
}

偶数交换

本题解由微信公众号小猿刷题提供, 错误之处, 欢迎指正.

遍历数组,将所有偶数元素依次交换到数组前列.

/**
 * 微信公众号"小猿刷题"
 */
class Solution {
    public static int[] sortArrayByParity(int[] A) {
        int offset = 0;
        for(int i = 0; i < A.length; i++){
            if(A[i] % 2 == 0){
                swap(A, i, offset++);
            }
        }
        return A;
    }
    
    public static void swap(int[] arr, int left, int right){
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
    } 
}

原地快排

本题解由微信公众号小猿刷题提供, 错误之处, 欢迎指正.

  • 定义两个指针分别从高位(寻找偶数元素)和低位(寻找奇数元素)扫描. 寻找到交换位置.
/**
 * 微信公众号"小猿刷题"
 */
class Solution {
    
    public static int[] sortArrayByParity(int[] A) {
        int left = 0;
        int right = A.length - 1;
        while(left < right){
            // 遍历直到第一个偶数跳出
            while(left < right && A[right] % 2 != 0){
                right --;
            }
            // 遍历直到第一个奇数跳出
            while(left < right && A[left] % 2 == 0){
                left ++;
            }
            swap(A, left, right);
        }
        return A;
    }
    
    public static void swap(int[] arr, int left, int right){
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
    } 
}

小猿刷题

00922 按奇偶排序数组 II

题目描述

给定一个非负整数数组 AA 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

你可以返回任何满足上述条件的数组作为答案。

示例:

输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

提示:

  • 2 <= A.length <= 20000
  • A.length % 2 == 0
  • 0 <= A[i] <= 1000

力扣地址

解题报告

本题解由微信公众号小猿刷题提供, 错误之处, 欢迎指正.

  • 定义两个指针,分别记录偶数和奇数元素的位置.
  • 遍历数组把所有的偶数放进 ans[0]ans[2]ans[4],奇数放进 ans[1]ans[3]ans[5],依次类推.
/**
 * 微信公众号"小猿刷题"
 */
class Solution {
    public int[] sortArrayByParityII(int[] A) {
        int[] list = new int[A.length];
        int i = 0;
        int j = 1;
        for (int x: A) {
            if (x % 2 == 0) {
                list[i] = x;
                i += 2;
            }
            if (x % 2 == 1) {
                list[j] = x;
                j += 2;
            }
        }
        return list;
    }
}

小猿刷题