问题描述
试题编号: 201503-2
试题名称: 数字排序
时间限制: 1.0s
内存限制: 256.0MB
问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
评测用例规模与约定
1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
解题思路
- 构造一个数据结构记住数字及其出现次数。在Python程序内,这个数据结构就是字典。字典的键值对是<数字,出现次数>。
- 遍历输入序列的每个数字,如果数字已经在字典中,那么出现次数增1;如果数字没有在字典中,那么出现次数设为1。
- 按出现次数从大到小排序输出。如果两个数字的出现次数一样,那么按数字从小到大输出。
参考答案
n = int(input())
nums = [int(s) for s in input().split()]
num_count_dict = {}
for num in nums:
if num in num_count_dict:
num_count_dict[num] += 1
else:
num_count_dict[num] = 1
num_count_list = list(num_count_dict.items())
#经过两次调用sort(),做到:按出现次数从大到小排序输出。如果两个数字的出现次数一样,那么按数字从小到大输出。
#这是Python手册推荐的做法。Python采用的排序算法使得时间开销不是两次独立的排序之和。
num_count_list.sort() # 按数字从小到大排序
num_count_list.sort(key = lambda num_count: num_count[1], reverse=True) #按出现次数从大到小排序
for num_count in num_count_list:
print(num_count[0], num_count[1])
测试用例
- 题目描述给出的测试用例已经覆盖了两个数字出现次数一样的情形。
- n=1的情形。
样例输入
1
5
样例输出
5 1 - 出现次数都不一样的情形。
样例输入
3
5 2 2
样例输出
2 2
5 1
小结
- Python语言实现排序的做法有点特别,值得学习研究。
- 利用Python语言的字典,能够高效地实现统计出现次数这一类问题。
- Python语言的lambda表达式应用场合颇多,也值得学习研究。