1. 问题描述:
给你一个下标从 0 开始的整数数组 nums 。根据下述规则重排 nums 中的值:按非递增顺序排列 nums 奇数下标上的所有值。
举个例子,如果排序前 nums = [4,1,2,3] ,对奇数下标的值排序后变为 [4,3,2,1] 。奇数下标 1 和 3 的值按照非递增顺序重排。
按非递减顺序排列 nums 偶数下标上的所有值。
举个例子,如果排序前 nums = [4,1,2,3] ,对偶数下标的值排序后变为 [2,1,4,3] 。偶数下标 0 和 2 的值按照非递减顺序重排。
返回重排 nums 的值之后形成的数组。
示例 1:
输入:nums = [4,1,2,3]
输出:[2,3,4,1]
解释:
首先,按非递增顺序重排奇数下标(1 和 3)的值。
所以,nums 从 [4,1,2,3] 变为 [4,3,2,1] 。
然后,按非递减顺序重排偶数下标(0 和 2)的值。
所以,nums 从 [4,1,2,3] 变为 [2,3,4,1] 。
因此,重排之后形成的数组是 [2,3,4,1] 。
示例 2:
输入:nums = [2,1]
输出:[2,1]
解释:
由于只有一个奇数下标和一个偶数下标,所以不会发生重排。
形成的结果数组是 [2,1] ,和初始数组一样。
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-even-and-odd-indices-independently/
2. 思路分析:
分析题目可以知道模拟题目中的过程即可。
3. 代码如下:
go:
package main
import (
"fmt"
"sort"
)
func sortEvenOdd(nums []int) []int {
n := len(nums)
// mp[0]存储奇数下标的值, mp[1]存储偶数下标的值
mp := [][]int{{}, {}}
for i, x := range nums {
// 通过&1操作将数字存储到对应下标上
mp[i&1] = append(mp[i&1], x)
}
// 分别对偶数下标与奇数下标排序
sort.Ints(mp[0])
// 使用sort.Slice函数对切片从到到小排序
sort.Slice(mp[1], func(i, j int) bool {
return mp[1][i] > mp[1][j]
})
res := []int{}
for i := 0; i < n/2; i++ {
res = append(res, mp[0][i])
res = append(res, mp[1][i])
}
// 如果nums长度为奇数那么需要加上最后一个元素
if n&1 == 1 {
res = append(res, mp[0][len(mp[0])-1])
}
return res
}
python:
from typing import List
class Solution:
def sortEvenOdd(self, nums: List[int]) -> List[int]:
odd, even = list(), list()
for i in range(len(nums)):
# i & 1 == 1即i为奇数
if i & 1:
odd.append(nums[i])
else:
even.append(nums[i])
odd.sort(reverse=True)
even.sort()
for i in range(len(nums)):
if i & 1:
# 弹出列表的第一个元素
nums[i] = odd.pop(0)
else:
nums[i] = even.pop(0)
return nums