ccf 2015032 数字排序 100分(三种python实现的方法,强推)

这是一篇关于解决CCF 2015032数字排序问题的博客,作者分享了三种Python实现方法:1) 全局+局部排序;2) 利用数组索引;3) 整体排序两次。文章对比了三种方法的计算速率,并提供了详细代码示例。
摘要由CSDN通过智能技术生成

问题描述
试题编号: 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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值