这道题是python程序设计课的作业题,感觉挺好的,一搜发现是CCF2015的题目,题目如下
【问题描述】
给定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
【样例说明】
n不超过1000,给出的数为2,000,000,000以内的非负整数。
本来这题是要用正常解法O(n^2)加桶排序才能不超时的,但是由于使用了python,可以引用字典来解这个问题
使用了python后,可以使用字典来统计各个数据出现的次数,然后对字典的键进行排序,生成一个有序列表,然后遍历这个有序列表,每遍历一次选出最大的值,然后删掉列表里对应的键,由于是从小到大遍历,所以对应的值相等则按键从小到大这个条件就自动满足了,这也是一个不错的解法,代码如下。
n = int(input())
data = input().split(" ",n)
d = {}
for i in data:
if int(i) not in d:
d[int(i)] = 1
else:
d[int(i)] += 1
jian = sorted(d)
# print(d)
max = 0
while jian:
max = 0
for i in jian:
if d[i] > max:
max = d[i]
icon = i
print("{} {}".format(icon,max))
jian.remove(icon)
# print(jian)
max = 0