LeetCode.922 按奇偶排序数组 II

134 阅读1分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

题目描述:

922. 按奇偶排序数组 II - 力扣(LeetCode) (leetcode-cn.com)

给定一个非负整数数组 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] 也会被接受。

提示:

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

思路分析

遍历

这个最简单了,直接遍历2遍,第一遍,把所有的偶数放进ans[0]\textit{ans}[0]ans[2]\textit{ans}[2]ans[4]\textit{ans}[4],以此类推。

同样的,第二遍,把所有的奇数放进ans[1]\textit{ans}[1]ans[3]\textit{ans}[3]ans[5]\textit{ans}[5],以此类推。

AC代码

class Solution {
    fun sortArrayByParityII(nums: IntArray): IntArray {
        var ans = IntArray(nums.size)
        var i = 0
        nums.forEach {
            if(it % 2 == 0) {
                ans[i] = it
                i += 2
            }
        }
        var j = 1

        nums.forEach {      
            if(it % 2 == 1) {
                ans[j] = it
                j += 2
            }
        }

        return ans
    }
}

双指针

  • 首先为数组的偶数下标部分和奇数下标部分分别维护两个指针i和j
  • 如果nums[i]所指元素为奇数,因为i是偶数下标,j是奇数下标,那么就得在奇数下标里面找一个偶数和nums[i]交换,也就是不断的让j往后每次移动2个单位,直到找到一个偶数去交换。

AC代码

class Solution {
    fun sortArrayByParityII(nums: IntArray): IntArray {
        var p1 = 0
        var p2 = 1
        while (true) {
            while ((nums[p1] and 1) == 0) {
                p1 += 2
                if (p1 >= nums.size) return nums
            }
            while ((nums[p2] and 1) == 1) {
                p2 += 2
                if (p2 >= nums.size) return nums
            }
            nums[p1] = nums[p1] xor nums[p2]
            nums[p2] = nums[p1] xor nums[p2]
            nums[p1] = nums[p1] xor nums[p2]
        }
    }
}

总结

简简单单每日一题,两个解法get。

参考

922. 按奇偶排序数组 II 题解 - 力扣(LeetCode) (leetcode-cn.com)

按奇偶排序数组 II(双指针+辅助数组) - 按奇偶排序数组 II - 力扣(LeetCode) (leetcode-cn.com)