P8598 [蓝桥杯 2013 省 AB] 错误票据(python题解)

n = int(input())
##首先读取输入的行数n
ids = []
## 然后逐行读取数据,将每行的多个 ID 号转换为整数列表
for _ in range(n):
    l = list(map(int, input().split()))
    ids.extend(l)
## 使用extend方法将所有 ID 号合并到一个列表ids中

id = set()
## 利用集合id的特性(元素唯一)来检测重号
r = -1
## 遍历所有 ID 号,若当前号码已在集合中,说明是重号,记录到r
for u in ids:
    if u in id:
        r = u
    id.add(u)
## 无论是否重复,都将号码加入集合,用于后续查找断号

s = sorted(id)
## 先将去重后的 ID 号排序,便于检查连续性
m = -1
## 遍历排序后的 ID,若相邻两个 ID 的差值大于 1,说明中间有断号
for i in range(1, len(s)):
    if s[i] - s[i - 1] > 1:
        m = s[i - 1] + 1
## 断号的值为 "前一个 ID + 1",记录到m
        break

print(m, r)
## 按格式输出找到的断号和重号

核心思路

  • 利用集合的特性快速检测重号(集合中不能有重复元素)
  • 通过排序和检查相邻元素差值来寻找断号
  • 假设题目保证只有一个断号和一个重号,因此找到后可直接返回这种方法逻辑清晰,时间效率较高,能够准确解决题目要求的查找问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值