按照数值个数排序
题目描述
Description
对给定数组中的元素按照元素出现的次数排序,出现次数多的排在前面,如果出现次数相同,则按照数值大小排序。例如,给定数组为{2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12},则排序后结果为{3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5}。
Input
输入的第一行为用例个数;后面每一个用例使用两行表示,第一行为数组长度,第二行为数组内容,数组元素间使用空格隔开。
Output
每一个用例的排序结果在一行中输出,元素之间使用空格隔开。
Sample Input 1
1
4
2 3 2 5
Sample Output 1
2 2 3 5
思路解析
这道题比较简单
- 构建一个map数组,首先统计个数
- 将map按照值从大到小,值相同时键从小到大排序即可
代码实现(python)
from collections import defaultdict
if __name__ == '__main__':
case_num = int(input().strip())
for i in range(case_num):
_ = input()
arr = [int(x) for x in input().strip().split(" ")]
dict = defaultdict(int)
for x in arr:
dict[x] += 1
dict2 = sorted(dict.items(), key=lambda x: (-x[1], x[0])) # 值从大到小,值相同时键从小到大
res = []
for k, v in dict2:
for i in range(v):
res.append(str(k))
print(" ".join(res))
使用计数器
from collections import Counter
if __name__ == '__main__':
case_num = int(input().strip())
for i in range(case_num):
_ = input()
arr = [int(x) for x in input().strip().split(" ")]
dict = Counter(arr)
dict2 = sorted(dict.items(), key=lambda x: (-x[1], x[0]))
res = []
for k, v in dict2:
for i in range(v):
res.append(str(k))
print(" ".join(res))