昨天晚上拼多多笔试不是像平时刷题那样直接让实现一个函数,而是需要自己处理输入输出。这让我意识到平时我对输入输出的问题关注的太少了,平时要么刷题直接给好接口,自己写测试用例也都是直接写到变量里面,跳过了输入数据的这一步。这导致当面对各种输入的时候我还要先考虑输入怎么写,很浪费心力。因此,今天就来总结一下,对于笔试中各种输入怎么处理最方便。
1. 输入单个数字或者字符
这个很简单,直接定义一个变量用来存储数字或者字符,然后cin>>变量,就把输入存到了对应的变量里。
int single;
cin >> single;
cout << single << endl;
2. 输入一行确定数目的字符,存入vector中
因为如果确定知道输入的数字或者string的个数n,所以就可以使用n来作为循环次数的条件。
数字:
int n = 4;
vector<int> input(n);
int i = 0;
while (i < n) {
cin >> input[i];
i++;
}
字符串:
int n = 4;
vector<string> input(n);
int i = 0;
while (i < n) {
cin >> input[i];
i++;
}
数字和字符串cin就能自动处理,只需要改变vector的类型即可。
3. 不确定个数的一行输入
可以使用cin>>temp来作为while的循环条件,就可以输入不确定个数的一行输入。但是使用cin>>temp作为循环的条件时,输入的最后需要加上结束符Ctrl+Z,碰到结束符该条件才会为false,从而退出循环。自己输入的测试用例的时候需要添加结束符,笔试中题目自动给的输入应该是有结束符的。
数字:
vector<int> input;
int temp = 0;
while (cin >> temp) {
input.push_back(temp);
}
字符串:
vector<string> input;
string temp;
while (cin >> temp) {
input.push_back(temp);
}
4. 多行输入
多行输入可以用getline来处理,并且用istringstream类来处理每一行。getline(cin,line)函数用来每次获取一行输入的字符串,然后用istringstream类通过>>操作符来分隔每一个单词。
数字:
vector<vector <int> > input;
string line;
while (getline(cin, line)) {
istringstream temp(line);
int num;
vector<int> tmpVector;
while (temp >> num) {
tmpVector.push_back(num);
}
input.push_back(tmpVector);
}
for (auto line : input) {
for (auto num : line)
cout << num << " ";
cout << endl;
}
字符串:
vector<vector <string> > input;
string line;
while (getline(cin, line)) {
istringstream temp(line);
string str;
vector<string> tmpVector;
while (temp >> str) {
tmpVector.push_back(str);
}
input.push_back(tmpVector);
}
for (auto line : input) {
for (auto num : line)
cout << num << " ";
cout << endl;
}
5. 注意!!!
刷一道题的时候,碰到要输入已知长度的一行字符串,于是采用了第2节所示的方法进行输入,但是思路没问题却一直只通过80%的测试用例。后来用未通过的测试案例跑才发现问题。问题不在算法而在输入,当用cin去处理输入的时候,碰到了字符串中有空格就会出错。因为cin不能处理带空格的字符串,一遇到空格就切分成若干段了,因此如果是输入里可能会带空格的都万万不能用cin来输入,只能用getline来输入。建议除了最简单的输入一两个数字的情况用cin,剩下的输入最好都用getline来处理,避免出错。
如果遇到输入是第一行是数字,后面是字符串。全部用getline来处理也是可以的。如果想先把数字拿出来,剩下的再用getline处理也是可以的。但是需要注意,用cin先取出了数字后,再使用getline去取第二行输入的时候,由于前面用了cin,导致第一个getline会获取到一个空的行。这也很好处理,只需要在进入getline的循环之前,多用一个getline去掉第一行的空行。
int num;
cin >> num;
//用space去除第一行的空行
string space;
getline(cin, space);
//正式输入同上
vector<vector <int> > input;
string line;
while (getline(cin, line)) {
istringstream temp(line);
int num;
vector<int> tmpVector;
while (temp >> num) {
tmpVector.push_back(num);
}
input.push_back(tmpVector);
}