23.5.14 力扣每日一题:1054
题干
在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]
。
请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
示例1:`
输入:barcodes = [1,1,1,2,2,2]
输出:[2,1,2,1,2,1]
示例2:
输入:barcodes = [1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]
数据大小和范围
1 <= barcodes.length <= 10000
1 <= barcodes[i] <= 10000
思路:
-
首先可以将整个列表的出现的数字,按照数字出现次数,从大到小进行排序。如果两个数字的出现次数相同,则按照数字本身的大小进行排序。这样就能得到第一步,已经排序好了的一个数组。
-
接下来,新定义一个 ans 列表,将它设置为和原本的 barcodes 大小相同。在此设 ans 列表的大小为 n。我们可以将整个 ans 列表分成两个部分:奇数部分 和 偶数部分。这样,将排序后的 barcodes 数组每个元素先插入 ans 中所有的奇数位置,在奇数位置插入完成以后,再插入偶数位置。全部插完后,返回即可。
代码实现:
class Solution:
def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
cnt = Counter(barcodes)
barcodes.sort(key=lambda x: (-cnt[x], x))
n = len(barcodes)
ans = [0] * len(barcodes)
ans[::2] = barcodes[: (n + 1) // 2]
ans[1::2] = barcodes[(n + 1) // 2:]
return ans
代码转载自此处