题目:
1204. 错误票据 - AcWing题库
思路:
将输入的数据存入数组,从小到大排序后遍历,若 (a[i] == a[i - 1])res1 = a[i]--->重号;若(a[i] - a[i - 1] >= 2)res2 = a[i] - 1--->断号。
难点:题目只告诉我们输入几行,且并不知道每行有多少个,因此无法直接将输入数据存入定义好的连续数组。(cin无法处理换行符)
1.针对上述情况,我们可以先用getline(cin,line)将整行数据(包括空格)先存入字符串(string)变量中。再定义字符串流stringstream对象ssin,并将前面读取的line传递给它。
这样,你可以使用ssin
来解析和操作字符串中的数据。接下来的循环while (ssin >> a[n])n++;
在每次循环中从ssin
中读取一个整数,并保存到数组a
中。(字符串中的空格也就不会进入数组a[])
代码:
#include<iostream>
#include<sstream>//字符串流头文件
#include<algorithm>
#include<string>
using namespace std;
int n;//表示ID号码数量
const int N = 10010;
int a[N];
int main()
{
int cnt;//表示行数
cin >> cnt;
string line;
getline(cin, line);//忽略掉第一行的回车
while (cnt--) {
getline(cin, line);//读入一行数据存入line
stringstream ssin(line);//定义一个字符串流对象ssin,初始化为line
while (ssin >> a[n])n++;//这里的ssin会将其中的整数传出,且不会将空格传入数组a[]中
}
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;
}
特别注意:
使用getline读入一整行时,如果之前写过cin,由于cin中有默认换行,getline会将其也读入,使得字符串类型的变量line的第一个元素是空的。因此,我们需要在读入之前先getline(cin, line)--->忽略掉第一行的回车。(不要问为什么这样写,c++爸爸规定滴)