题目详细:
解题思路:
这题的难点
主要在于对于数据的读入
以及对于两个数字的查找
对于数据的读入:
1.直接对单行字符串进行转换:
题目所给出的输入只有行数
并不知道一行有多少个数字
所以我们采用一下读取一行
然后对一行的结果进行读入
首先展示一种比较容易理解的读入:
int k=0;
while(cnt--){
getline(cin,line);//读取一行
for(int i=0;i<line.length();i++){
while(line[i]!=' '&&line[i]!='\0'){//对读入的字符进行转换
a[k]=a[k]*10+line[i]-'0';
i++;
}
k++;
}
}
2.利用stringstream将字符串转换:
其中利用的原理是:
stringstream转化的数值会按照转化不了的值进行分割,
举个栗子:
对于字符串:
int a[100];
string s="12 34 56 34 23";
用stringstream ss;
ss<<s;
int i=0;
while(ss<<a[i]) i++;
就会把s中的数字依次放入到数组a中
a[100]={12,34,56,34,23......};
所以读入题目数据代码:
while(cnt--){
getline(cin,line);
stringstream ss;
ss<<line;
while(ss>>a[n]) n++;
}
对于断号和重号的查询:
映射查找:
对于读入的数据我们可以通过
映射到一个数组
2表示出现过两次,1表示该数出现过一次,0表示没有出现过
然后就可以找到题目正解
排序查找:
我们也可以先把数据排好序
然后遍历一遍
两数之间间隔为2表示存在缺号情况
间隔为0表示存在重号
详细代码:
#include<iostream>
#include<sstream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e4+6;
int a[N];
int n;
int main(){
int cnt;
cin>>cnt;
string line;
getline(cin , line);//getline会读取回车,所以先把回车提前读取
while(cnt--){
getline(cin,line);
stringstream ss;
ss<<line;
while(ss>>a[n]) n++;
}
sort(a,a+n);
int dh,ch;
for(int i=0;i<n;i++){
if(a[i]==a[i+1]) ch=a[i];
if(a[i+1]-a[i]>1) dh=a[i]+1;
}
cout<<dh<<" "<<ch;
return 0;
}
PS:不知乘月几人归,落月摇情满江树。