当前位置: 首页 > news >正文

Python排序 -- 内附蓝桥题:错误票据,奖学金

排序

~~不定时更新🎃,上次更新:2023/02/28
在这里插入图片描述

🗡常用函数(方法)

1. list.sort() --> sort 是 list 的方法,会直接修改 list

举个栗子🌰

li = [2,3,1,5,4]
li.sort()
print(li) # [1, 2, 3, 4, 5]

2. sorted(iterable,key,reverse) --> 将可迭代对象进行排序,无法修改可迭代对象

举个栗子🌰

li = [2,3,1,5,4]
new = sorted(li)
print(li) # [2, 3, 1, 5, 4]
print(new) # [1, 2, 3, 4, 5]

🔴 sorted的参数 key --> 指定哪个元素排列举个栗子🌰

li = [[1,2,3],[5,6,7],[1,1,6]]
# 对每个列表的第一个元素进行排序(升序)
one = sorted(li,key=lambda x:x[0])# 结果为 [[1, 2, 3], [1, 1, 6], [5, 6, 7]]
print(one)
# 在第一个元素进行升序排序的基础上,对第二个元素进行升序排序
two = sorted(li,key=lambda x:(x[0],x[1])) # 结果为[[1, 1, 6], [1, 2, 3], [5, 6, 7]]
print(two)

🔵 sorted的参数 reverse–> 指定排列顺序,不设置默认为升序举个栗子🌰

li = [1,8,5,3,4]
# 默认升序
print(sorted(li)) # [1, 3, 4, 5, 8]
# 降序
print(sorted(li,reverse=True)) # [8, 5, 4, 3, 1]

⚫️ 补充:用 key 也可以实现降序效果,只需要将 x 映射为负数即可,举个栗子🌰 ****

li = [1,8,5,3,4]
# 降序
print(sorted(li,key = lambda x:-x)) # [8, 5, 4, 3, 1]

蓝桥例题1- 错误票据 🎫

题目描述

某涉密单位下发了某种票据,并要在年终全部收回。

每张票据有唯一的 ID 号。全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。

因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。

你的任务是通过编程,找出断号的 ID 和重号的 ID

假设断号不可能发生在最大和最小号。

输入描述

输入描述

要求程序首先输入一个整数 N (N<100)表示后面数据行数。

接着读入 N 行数据。

每行数据长度不等,是用空格分开的若干个(不大于 100 个)正整数(不大于10510^5105)。

输出描述

要求程序输出 1 行,含两个整数 m,n,用空格分隔。

其中,m 表示断号 IDn 表示重号 ID

输入输出样例

示例

输入

2
5 6 8 11 9
10 12 9

输出

7 9

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 64M

思路

  1. 通过 + 把列表进行拼接可以得到一个完整的列表
  2. 用 sorted 函数排序,得到一个有序的列表
  3. 如果前一个号 != 后一个号有两种情况:
    • 情况1:出现重号 --> 即 前一个号 == 后一个号
    • 情况2:出现断号 --> 即 前一个号 + 2 == 后一个号(实际上排除掉情况 1,就是情况 2)

代码

n = int(input())
li = []
for i in range(n):li += list(map(int,input().split()))li = sorted(li)for i in range(len(li)-1):if li[i]+1 != li[i+1]: # 断号/重号if li[i] == li[i+1]: # 重号n = li[i]else: # 断号m = li[i]+1print(m,n)

蓝桥例题2 - 奖学金 💸

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学生发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前 5 名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:

7 279
5 279

这两行数据的含义是:总分最高的两个同学的学号依次是 7 号、5 号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和),但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:

5 279
7 279

则按输出错误处理,不能得分。

输入描述

1 行为一个正整数 n(6≤n≤300),表示该校参加评选的学生人数。

2n+1 行,每行有 3 个用空格隔开的数字,每个数字都在 0100 之间。第 j 行的 3 个数字依次表示学号为 j−1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1 ~ n(恰好是输入数据的行号减 1)。

所给的数据都是正确的,不必检验。

输出描述

输出共有 5 行,每行是两个用空格隔开的正整数, 依次表示前 5 名学生的学号和总分。

输入输出样例

示例 1

输入

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出

6 265
4 264
3 258
2 244
1 237

示例 2

输入

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出

8 265
2 264
6 264
1 258
5 258

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

思路

  1. 将 1 个学生的总分,学号,语数英成绩存在一个列表中
  2. 通过 sorted 中的 key 参数 和 reverse 参数 使得可以按照总分排序降序,总分相同,语文排序降序
  3. 为什么不用排学号?由于学号一开始是升序的,所以在排序中,必然也会尽量保证其升序的性质,也就是说,总分相同和语文成绩相同的学生,学号小的必然在前,因为学号保持了其有序性。

代码

n = int(input())
li = []
for i in range(n):x,y,z = map(int,input().split())Sum = x + y + z # 总分li.append([i+1,Sum,x,y,z]) # 添加五元组li = sorted(li,key=lambda x:(x[1],x[2]),reverse=True) # 总分排序降序,总分相同,语文排序降序for i in range(5):print(li[i][0],li[i][1])

如有错误,敬请指正,欢迎交流🤝,谢谢♪(・ω・)ノ

http://www.lryc.cn/news/24552.html

相关文章:

  • 容器化部署是什么意思?有什么优势?
  • 1.设计模式简介
  • 【算法题解】实现一个包含“正负数和括号”的基本计算器
  • 网站服务器如何防护攻击?网站服务器被挂马如何检测
  • JavaSE16-面向对象-接口
  • 安卓设备蓝牙键盘快捷键
  • Puppeteer项目结构梳理
  • (02)Unity HDRP Volume 详解
  • 拒绝B站邀约,从月薪3k到年薪47W,我的经验值得每一个测试人借鉴
  • 分享一种实用redis原子锁的方式
  • 【华为OD机试】 字符串解密(C++ Java JavaScript Python)
  • 金三银四,助力你的大厂梦,2023年软件测试经典面试真题(1)(共3篇)
  • 假如面试官要你手写一个promise
  • 【leetcode】寻找重复数
  • LeetCode 1247. Minimum Swaps to Make Strings Equal【数学,贪心,字符串】
  • pid控制加热算法,附代码仓库
  • 一文看懂预训练和自训练模型
  • (五十四)大白话索引的页存储物理结构,是如何用B+树来实现的?.md
  • 前端Vue代码风格指南
  • 「TCG 规范解读」基础设施架构和协议 (2)
  • NodeJs 中的 HTML 模板
  • 3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解
  • Kubernetes初始化容器
  • leetcode: Swapping Nodes in a Linked List
  • Nydus 在约苗平台的容器镜像加速实践
  • 企业对不同形态CRM系统价格需求不同
  • 「JVM 高效并发」线程安全
  • 微信扫码登录
  • Unity协程的简单应用
  • LeetCode 1250. Check If It Is a Good Array【数论】