-重复ID蓝桥杯问题-

某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的 ID 号。全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。你的任务是通过编程,找出断号的 ID 和重号的 ID 。假设断号不可能发生在最大和最小号。

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

每行数据长度不等,是用空格分开的若干个(不大于 100 个)正整数(不大于1*10^5)

输出描述
要求程序输出 1 行,含两个整数 m,n,用空格分隔。
其中,m 表示断号 ID,n 表示重号 ID。

输入输出样例
示例
输入
2
5 6 8 11 9
10 12 9
输出
7 9
运行限制
最大运行时间:1s
最大运行内存: 64M

N = int(input())
b = []
n = 0
m = 0
for i in range(N):
  num = input.split()
  for j in range(len(num)):
      b.append(int(num[j]))
a.sort()
for i in range(len(b)):
  if b[i] != b[0] + i:
    m = b[0] + i
    break
print(m,n)

请问为什么n怎么输出都是0?为什么不是9

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在上述代码中,虽然正确找出了断号 ID,但是重号 ID 并没有找出,因此输出的 n 始终为 0。

为了找出重号 ID,我们可以对输入数据进行去重,并累计数据总和,然后减去去重后的总和,即为重号 ID。

下面是修改后的代码:

N = int(input())
b = []
n = 0
m = 0
for i in range(N):
    num = input().split()
    for j in range(len(num)):
        b.append(int(num[j]))
# 找断号 ID
b.sort()
for i in range(len(b)):
    if b[i] != b[0] + i:
        m = b[0] + i
        break
# 找重号 ID
s = sum(b)
unique_b = set(b)
unique_sum = sum(unique_b)
n = s - unique_sum
print(m,n)

这样,输出的 n 就可以正确显示重号 ID 了。

该回答引用ChatGPT

在给定的代码中,虽然已经对输入的数据进行了处理,但是还没有求出重号的 ID。因此,可以在排序后的数组中查找重号的 ID。

具体来说,可以通过扫描整个数组来查找相邻的两个元素是否相等,如果相等,则表示出现了重号的情况。此时,记录下这个重号的 ID,同时将这个 ID 从数组中删除,以避免影响到断号的查找。

修改后的代码如下所示:

N = int(input())
b = []
for i in range(N):
    num = input().split()
    for j in range(len(num)):
        b.append(int(num[j]))
b.sort()

m = 0
n = 0
for i in range(len(b) - 1):
    if b[i] == b[i + 1]:
        n = b[i]
        del b[i]
        break

for i in range(len(b)):
    if b[i] != b[0] + i:
        m = b[0] + i
        break

print(m, n)

在这段代码中,我们首先对输入的数据进行处理,将所有的 ID 存储到数组 b 中,并对其进行排序。然后,我们扫描整个数组,查找相邻的两个元素是否相等,如果相等,则表示出现了重号的情况。此时,记录下这个重号的 ID,并将这个 ID 从数组中删除。接着,我们再次扫描整个数组,查找断号的 ID 并记录下来。最后,输出断号的 ID 和重号的 ID。

n的值没有变过,所以最终还是0。n应该指的是重复的数字,可以使用机器人的代码里集合去重后相减的做法。
但是你的代码和上面机器人的代码都有个缺陷,那就是如果重复的数字出现在断号的数字之前,比如,1,2,2,3,4,6,7,8,应该输出5 2,机器人的代码会输出3 2。断号并不正确。
可以先去重,再排序,再使用你的方法找到断号。代码如下:

N = int(input())
b = []
n = 0
m = 0
for i in range(N):
    num = input().split()
    for j in range(len(num)):
        b.append(int(num[j]))

unique_b = sorted(set(b))
n = sum(b) - sum(unique_b)

for i in range(len(unique_b)):
    if unique_b[i] != unique_b[0] + i:
        m = unique_b[0] + i
        break

print(m,n)
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^