「这是我参与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 <= A.length <= 50000 <= 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;
};
今天的力扣刷题就分享到这里,感谢大家的阅读~