「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
题目描述:
922. 按奇偶排序数组 II - 力扣(LeetCode) (leetcode-cn.com)
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
对数组进行排序,以便当 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 <= 20000A.length % 2 == 00 <= A[i] <= 1000
思路分析
遍历
这个最简单了,直接遍历2遍,第一遍,把所有的偶数放进,,,以此类推。
同样的,第二遍,把所有的奇数放进,,,以此类推。
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)