【力扣刷题】905. 按奇偶排序数组

122 阅读1分钟

「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战

原题链接

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

题目描述

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

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

测试用例

示例:

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

参数限制

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

分析

如题,给定一个数组,需要我们将偶数放在前面,奇数放在最后,并且对他们的排列顺序没有要求

最简单的做法,定义一个新的数组 arr,遍历 nums 的时候,偶数使用 unshift 插入 arr 的前面,奇数则使用 push 直接往 arr 的后面追加;最后返回的 arr 即为题目的答案

代码

var sortArrayByParity = function(nums) {
    let arr = [];
    nums.forEach(n => {
        if (n % 2 == 0) {
            arr.unshift(n)
        } else {
            arr.push(n)
        }
    })
    return arr;
};

空间优化

上一个解法中,由于初始化了一个新的数组,则使用了额外的空间。我们可优化为在原数组上做原地替换优化掉这部分的空间消耗

具体思路就是,定义一个左指针 left=0,定义一个右指针 right=nums.length-1,左指针向右遍历,找到一个奇数,右指针向左遍历,找到一个偶数,然后这两个数直接交换。外层的循环调价为 left >= right,即左右指针之间没有需要处理的数据了。最后返回修改后的 nums 即可

var sortArrayByParity = function(nums) {
    let l = 0,
        r = nums.length - 1;
    let temp;
    for (;;) {
        while (nums[l] % 2 == 0) {
            l++;
        }
        while (nums[r] % 2 == 1) {
            r--;
        }
        if (l >= r) break;
        temp = nums[l];
        nums[l] = nums[r];
        nums[r] = temp;
    }
    return nums;
};

今天的力扣刷题就分享到这里,感谢大家的阅读~