试题编号: | 201503-2 |
试题名称: | 数字排序 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。 输入格式 输入的第一行包含一个整数n,表示给定数字的个数。 输出格式 输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。 样例输入 12 样例输出 3 4 评测用例规模与约定 1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。 |
问题链接:CCF201503-2 数字排序
问题分析
本题主要解决两个问题即可:
一是要将出现的数字记录下来,并且同时记录其出现的频次。(可以用一个二维数组,0位置记录数字,1位置记录频次)
二是要对所存储好的信息进行排序。首先需要依靠频次由大到小进行排序,再者再对频次相同的数字由小到大进行排序。
具体实现请看下面完整代码
满分代码
#读入需要读入的信息
n=int(input())
num=input().split()
count=[]
#处理读入的数字
for i in range(n):
num[i]=int(num[i])
#设置一个标记,判断这个数字是否在count中存在
#存在为true,将对应的数字加1,不存在count中追加该数字
judge=False
for j in range(len(count)):
if count[j][0]==num[i]:
count[j][1]+=1
judge=True
break
if judge==False:
count+=[[num[i],1]]
#按照以每个数字出现的次数count[][1]来由大到小排列count
count.sort(key=lambda x:x[1],reverse=True)
#下面的操作就出现次数相同的数字都找出来,并且按照标记的大小由小到大排列
#由于比较困,所以下面写出来的操作比较冗长,读者可自行改写,只要实现功能即可。
judge_num=count[0][1]
s=[count[0]]
begin=0
end=0
for i in range(1,len(count)):
end=i
if count[i][1]==judge_num:
s+=[count[i]]
else:
s.sort(key=lambda x:x[0])
for j in range(begin,end):
count[j]=s[j-begin]
begin=i
judge_num=count[i][1]
s=[count[i]]
s.sort(key=lambda x:x[0])
for j in range(begin,end+1):
count[j]=s[j-begin]
#将结果输出来
for i in range(len(count)):
print(count[i][0],count[i][1])