题目
参考代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
int mmin = 999999, mmax = 0;
int rec[100005];
int a, b;
int main(void) {
cin >> n;
int tmp;
while (cin >> tmp) {
rec[tmp]++;
mmax = max(mmax, tmp);
mmin = min(mmin, tmp);
}
for (int i = mmin; i <= mmax; i++) {
if (rec[i] == 0) a = i;
if (rec[i] == 2) b = i;
}
cout << a << ' ' << b << endl;
return 0;
}
解题思路
(纯小白级解法,不用哈希表或者map)
由于ID号是连续的,并且最大ID不超过1e5
,所以可以用数组存储,不用担心爆栈的问题
用rec
数组记录每个ID出现的次数,记录的时候记下最小值和最大值,也就是ID的起点和终点
最后从起点开始遍历数组,出现次数为0的为缺少的ID,次数为2的为重复的ID,记录并输出即可
注意事项
- 输入的时候要求跳过空格,但是这个输入行数
n
十分迷惑,可以并不使用这个n并完成题目,使用while(cin>>tmp)
循环即可,个人觉得这道题的判对机制有些瑕疵,利用了这个小缺陷,建议读者参考一下不使用while
循环时应该怎么进行输入