题目描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。
全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
输入格式
第一行包含整数 N,表示后面共有 N 行数据。
接下来 N 行,每行包含空格分开的若干个(不大于100个)正整数(不大于100000),每个整数代表一个ID号。
输出格式
要求程序输出1行,含两个整数 m,n,用空格分隔。
其中,m表示断号ID,n表示重号ID。
数据范围
1≤N≤100
输入样例:
2
5 6 8 11 9
10 12 9
输出样例:
7 9
C++代码 1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 100010, INF = 10000000;
//数组vle存入值M出现的次数
int vle[M];
int main(){
int line, m, n, i;
int v, minv = INF, maxv = -INF;
cin >> line;
while(line --){
while(cin >> v){
minv = min(minv, v);//更新最小值
maxv = max(maxv, v);//更新最大值
vle[v] ++;
}
}
//断号出现0次即i ==0,重号出现2次即i == 2
for(int i = minv; i <= maxv; i ++){
if(vle[i] == 0) m = i;
if(vle[i] == 2) n = i;
}
cout << m << ' ' << n;
return 0;
}
C++代码 2
#include <iostream>
#include <cstring>
#include <sstream>
#include <algorithm>
using namespace std;
const int N = 1e4 + 10;
int n;
int a[N];
int main(){
int cnt;
cin >> cnt;
string line;
getline(cin, line);//或cin.get()或getchar() ---- 滤去上次的空格
while(cnt --){
getline(cin, line);
stringstream ssin(line);
while(ssin >> a[n]) n ++;
}
sort(a, a + n);
int res1, res2;
for(int i = 1; i < n; i ++){
if(a[i] == a[i - 1]) res1 = a[i];
else if(a[i] == a[i - 1] + 2) res2 = a[i] - 1;
}
cout << res2 << ' ' << res1 << endl;
return 0;
}
C ++ 代码3
#include <iostream>
#include <algorithm>
#include <sstream>
#include <algorithm>
using namespace std;
const int N = 10000;
int a[N];
int line;
int cnt;
int main(){
cin >> line;
cin.get();
while(line --){
string s;
getline(cin, s);
istringstream is(s);
string temp;
while(getline(is, temp, ' ')){
stringstream ss;
ss << temp;
ss >> a[cnt ++];
}
}
sort(a, a + cnt);
int m, n;
for(int i = 1; i <= cnt; i ++){
if(a[i] == a[i - 1]) m = a[i];
if(a[i] == a[i - 1] + 2) n = a[i - 1] + 1;
}
cout << n << ' ' << m;
return 0;
}
第二种解法学到了