【LeetCode & 剑指offer刷题】熟悉OJ平台2:如何处理输入问题
笔试中的编程题一般用OJ平台(如牛客网),而这些平台绝大部分都会要求自己写输入部分(不同于leetcode),如果对输入部分不熟悉的话会浪费很多时间,所以这一部分需熟练掌握。
输入问题
1 整数输入问题
//参考博文:ACM题目中输入数据的处理(C++版)
//最简单的输入,输入单行
Sample Input 1 2
Sample Output 3
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl; //对其他题目,换成要求的复杂处理与输出
return 0;
}
/*
输入多行数时,直到读至输入文件末尾(EOF)为止
说明1:当读到输入结束时,cin >> a >> b返回 0,循环也结束。
说明2:在调试程序时,键盘输入的数据,用CTRL-Z(即按住CTRL键不放,再按下Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。
重点掌握
Sample Input
1 5
10 20
400 516
Sample Output
6
30
916
*/
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(cin >> a >> b) //当题目输入行数不确定时使用此方法
{
cout << a+b << endl;
}
return 0;
}
/*
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。
当输入为 0 0 时,输入结束。
Sample Input
1 5
10 20
0 0
Sample Output
6
30
*/
#include<iostream>
using namespace std;
int main()
{
int a ,b;
while(cin>>a>>b&&(a||b))
{
cout<<a+b<<endl;
}
return 0;
}
/*
第一行是数据的组数N,
从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行
重点掌握
Sample Input
2
1 5
10 20
Sample Output
6
30
*/
#include <iostream>
using namespace std;
int main() {
int a, b, n;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> a >> b; //cin以空格或者回车作为输入输出分隔符
cout << a + b << endl;
}
return 0;
}
//利用文件重定向提高调试效率
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
freopen("input.txt","r",stdin); //将输入重定向到文件input.txt(注意文件路径)
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
} //在运行程序前,将本该由键盘输入的数据,写到文件input.txt中。而在运行程序时,数据将不再需要人去输入
2 读取和解析标点字符(如逗号)分隔数据
/*
处理输入问题:读取以逗号间隔的数字到数组中
例:
输入:1,12,123
数组a:a[0] = 1,a[1] = 12, a[2] = 123
*/
#include <vector>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
vector<int> a;
string s;
cin >> s; //读取输入字符串到s
stringstream input(s); //将字符串s转化为流
string numstr;
while (getline(input, numstr, ',')) //按逗号分隔为字符串(getline每次读一个)
{
a.push_back(stoi(numstr));
}
return 0;
}
/* 例子
输入:
2
19:90:23
23:59:59
输出:
19:00:23
23:59:59
*/
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
string numstr;
string output;
string inputstr;
cin >> inputstr; //读取一行字符串,方便处理
stringstream input(inputstr); //将字符串s转化为流,用cin需要考虑回车问题,用流就比较方便(因为inputstr已经跳过回车字符)
int count = 1;
while (getline(input, numstr, ':'))//getline会将其分隔转换为字符串
{
int num = stoi(numstr);//假设num一定为正数
if (count == 1)
{
if (num > 23)
numstr[0] = '0';
output += numstr + ':';
}
else
{
if (num > 59)
numstr[0] = '0';
output += numstr + ':';
}
count++;
}
output.pop_back();//移除末尾字符':'
cout << output<<endl;
}
}*
思路:使用 getline 和 stringstream 以 ',' 为分隔符来切分数据,然后使用标准库 string 的数值转换函数例如字符串转整形 stoi 进行解析。
注意:当数据以空格分隔时,可以直接用cin来读入!
参考资料: