Python入门习题(32)——CCF CSP认证考试真题:数字排序

CCF CSP认证考试真题:数字排序

问题描述

试题编号: 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. 构造一个数据结构记住数字及其出现次数。在Python程序内,这个数据结构就是字典。字典的键值对是<数字,出现次数>。
  2. 遍历输入序列的每个数字,如果数字已经在字典中,那么出现次数增1;如果数字没有在字典中,那么出现次数设为1。
  3. 按出现次数从大到小排序输出。如果两个数字的出现次数一样,那么按数字从小到大输出。

参考答案

n = int(input())
nums = [int(s) for s in input().split()]

num_count_dict = {}
for num in nums:
    if num in num_count_dict:
        num_count_dict[num] += 1
    else:
        num_count_dict[num] = 1

num_count_list = list(num_count_dict.items())
#经过两次调用sort(),做到:按出现次数从大到小排序输出。如果两个数字的出现次数一样,那么按数字从小到大输出。
#这是Python手册推荐的做法。Python采用的排序算法使得时间开销不是两次独立的排序之和。
num_count_list.sort()  # 按数字从小到大排序
num_count_list.sort(key = lambda num_count: num_count[1], reverse=True)  #按出现次数从大到小排序
for num_count in num_count_list:
    print(num_count[0], num_count[1])

测试用例

  1. 题目描述给出的测试用例已经覆盖了两个数字出现次数一样的情形。
  2. n=1的情形。
    样例输入
    1
    5
    样例输出
    5 1
  3. 出现次数都不一样的情形。
    样例输入
    3
    5 2 2
    样例输出
    2 2
    5 1

小结

  1. Python语言实现排序的做法有点特别,值得学习研究。
  2. 利用Python语言的字典,能够高效地实现统计出现次数这一类问题。
  3. Python语言的lambda表达式应用场合颇多,也值得学习研究。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值