CCF之数字出现次数排序

这道题是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
posted @ 2019-04-02 13:14  ayang818  阅读(446)  评论(0)    收藏  举报