题目描述
本题目取自CCF计算机软件能力认证考试真题。
试题编号: 201312-1
试题名称: 出现次数最多的数
时间限制: 1.0s
内存限制: 256.0MB
问题描述
给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
输入格式
输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。
输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。
输出格式
输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。
样例输入
6
10 1 10 20 30 20
样例输出
10
思路
- 用字典来存储各个数字的出现次数。以数字为键,出现次数为值,构成字典的键值对。
- 依次处理每个数,如果该数已经在字典中,那么出现次数增1;否则,该数的出现次数设为1。
- 字典转换为列表。而后,列表元素按出现次数从大到小排序,相同次数的,按数字从小到大排序。
代码
num = int(input())
ns = [int(s) for s in input().split()] #列表推导式。把input().split()得到的列表中的数字字符串转换为整数,得到整数列表。
n_c = {} #存储各个数字的出现次数的字典
for n in ns:
if n in n_c: #该数已经在字典中吗
n_c[n] += 1
else:
n_c[n] = 1
n_c_list = list(n_c.items()) #字典转换为列表
n_c_list.sort() #本次排序的意图是做到“相同次数的,按数字从小到大排序”。
n_c_list.sort(key=lambda item: item[1], reverse=True) #列表元素按出现次数从大到小排序
#key=lambda item: item[1],这里使用了lambda表达式,作用是指定出现次数为排序关键字。item类似于函数形参。排序期间,列表元素作为实参传给item。
print(n_c_list[0][0]) #输出排序后的列表首元素中的第一项(即出现次数最多的数字)
小结
- 利用字典,能够得到简洁的答案。
- Python列表(即数组)的排序的做法值得掌握。本题中,列表元素按出现次数从大到小排序,相同次数的,按数字从小到大排序。对应的做法是,进行两次排序,第一次是按数字从小到大排序,第二次是按出现次数从大到小排序。由于Python采用的排序算法具有稳定性,所以能保证“相同次数的,按数字从小到大排序”。