问题描述
试题编号: 201503-2
试题名称: 数字排序
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
给定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
评测用例规模与约定
1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
我能想到的三种解决办法分别为:
1:用sorted整体排序一次,再用sorted局部排序一次;
2:因为最大数字不超过1000,可直接利用数组的索引(思路是leon同学的);
3:整体用sorted排序两次,关键代码如下:
list_ele = sorted(list_ele,key = lambda x:(x[1],-x[0]),reverse=True)
用负号实现两种不同的排序方法。
三种方法的计算速率为:1>3>2
代码如下
# 方法一
N = int(input())
list1 = input().split()
dict_ele = {}
list_ele = []
for ele in list1:
if ele in dict_ele.keys():
dict_ele[ele] += 1
else:
dict_ele[ele] = 1
for key,value in dict_ele.items():
list_ele.append([int(key),value])
list_ele = sorted(list_ele,key = lambda x:x[1],reverse=True)
comp = list_ele[0][1]
k = 0
for i in range(len(list_ele)):
if list_ele[i][1] != comp:
list_ele[k:i] = sorted(list_ele[k:i],key = lambda x:x[0])
k,comp=i,list_ele[i][1]
list_ele[k:] = sorted(list_ele[k:],key = lambda x:x[0])
for ele in list_ele:
print(ele[0],ele[1])
# 方法二
N = input()
list1 = [int(ele) for ele in input().split()]
count = [0 for i in range(1001)]
for i in range(int(N)):
count[list1.pop()] += 1
for i in range(1001):
for j in range(1001):
if count[j] == 1001-i:
print(j,count[j])
# 方法三
N = int(input())
list1 = input().split()
dict_ele = {}
list_ele = []
for ele in list1:
if ele in dict_ele.keys():
dict_ele[ele] += 1
else:
dict_ele[ele] = 1
for key,value in dict_ele.items():
list_ele.append([int(key),value])
list_ele = sorted(list_ele,key = lambda x:(x[1],-x[0]),reverse=True)
for ele in list_ele:
print(ele[0],ele[1])