1204. 错误票据

题目:

1204. 错误票据 - AcWing题库

1204. 错误票据_第1张图片

思路: 

将输入的数据存入数组,从小到大排序后遍历,若 (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
#include//字符串流头文件
#include
#include
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++爸爸规定滴)

你可能感兴趣的:(模拟,字符串,算法,数据结构)