Python入门100道习题(9)——CCF CSP认证考试真题:出现次数最多的数

Python入门100道习题(9)——CCF CSP认证考试真题:出现次数最多的数

题目描述

本题目取自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. 用字典来存储各个数字的出现次数。以数字为键,出现次数为值,构成字典的键值对。
  2. 依次处理每个数,如果该数已经在字典中,那么出现次数增1;否则,该数的出现次数设为1。
  3. 字典转换为列表。而后,列表元素按出现次数从大到小排序,相同次数的,按数字从小到大排序。

代码

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])  #输出排序后的列表首元素中的第一项(即出现次数最多的数字)

小结

  1. 利用字典,能够得到简洁的答案。
  2. Python列表(即数组)的排序的做法值得掌握。本题中,列表元素按出现次数从大到小排序,相同次数的,按数字从小到大排序。对应的做法是,进行两次排序,第一次是按数字从小到大排序,第二次是按出现次数从大到小排序。由于Python采用的排序算法具有稳定性,所以能保证“相同次数的,按数字从小到大排序”。
发布了85 篇原创文章 · 获赞 86 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/yedouble/article/details/103942908
今日推荐