美文网首页小猿刷题程序员
「算法」按奇偶排序数组 & 按奇偶排序数组II

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

作者: 林昀熙 | 来源:发表于2020-01-15 07:45 被阅读0次

    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;
        }
    }
    
    小猿刷题

    相关文章

      网友评论

        本文标题:「算法」按奇偶排序数组 & 按奇偶排序数组II

        本文链接:https://www.haomeiwen.com/subject/cxdeactx.html