平时用力扣刷题,换成牛客这种需要打印输出结果对比判定的OJ不是很习惯,所以特别练习一下。尤其是对于8、9、10部分关于字符串的。
”纸上得来终觉浅,绝知此事要躬行“:练习代码
注意:变量在定义时最好就初始化,防止意想不到的bug
文章目录
1 不知道多少组
输入:
- 输入包括两个正整数a,b(1 <= a, b <= 1000),输入数据包括多组。
输出:
- 输出a+b的结果
分析:
- 不知道具体有多少组,所以外层的while循环应该在接收不到输入时停止
while(cin>>a>>b)
- 每一组结果之间要换行
cout<<a+b<<endl;
#include<bits/stdc++.h>
using namespace std;
int main(){
int a;
int b;
while (cin>>a>>b){
cout<<a+b<<endl;
}
return 0;
}
2 已知输入组数
输入描述:
- 输入第一行包括一个数据组数t(1 <= t <= 100)
- 接下来每行包括两个正整数a,b(1 <= a, b <= 1000)
输出描述:
- 输出a+b的结果
分析:
-
已知组数n了,直接循环n次,在循环体中处理输出逻辑
while(n--){}
-
输出之间换行
cout<<a+b<<"\n";
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
cout<<a+b<<"\n";
}
return 0;
}
3 未知多组+结束条件+0结束
输入描述:
- 输入包括两个正整数a,b(1 <= a, b <= 10^9)
- 输入数据有多组
- 如果输入为0 0则结束输入
输出描述:
- 输出a+b的结果
思考:
- 未知多组+两个输入均为0结束的条件
while(cin>>a>>b && (a||b)
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
while(cin>>a>>b && (a||b)){
cout<<a+b<<"\n";
}
return 0;
}
4 未知多组+组内给定n数据
输入描述:
- 输入数据包括多组。
- 每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
- 接下来n个正整数,即需要求和的每个正整数。
输出描述:
- 每组数据输出求和的结果
思路:
- 未知多组,每组中的第一个数n决定了后面的走向,所以外层循环的条件输入为n 且 n为0时结束输入
while(cin>>n && n!=0)
- 在循环体内部,根据n的数量处理,循环n次,输入到数组nums(跳出循环后处理)或tmp(在此循环内部累加)中
while(n--) { }
- 输出换行
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
while (cin >> n && n != 0) {
int tmp = 0, sum = 0;
while (cnt--) {
cin >> tmp;
sum += tmp;
}
cout << sum << "\n";
}
return 0;
}
5 t组输入+组内给定n数据
输入描述:
- 输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
- 接下来t行, 每行一组数据。
- 每行的第一个整数为整数的个数n(1 <= n <= 100)。
- 接下来n个正整数, 即需要求和的每个正整数。
输出描述:
- 每组数据输出求和的结果
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while (t--){
int n;
cin>>n;
int tmp;
int sum=0;
while (n--){
cin>>tmp;
sum += tmp;
}
cout<<sum<<"\n";
}
return 0;
}
6 未知多组+组内n数据
输入描述:
- 输入数据有多组, 每行表示一组输入数据。
- 每行的第一个整数为整数的个数n(1 <= n <= 100)。
- 接下来n个正整数, 即需要求和的每个正整数。
输出描述:
- 每组数据输出求和的结果
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
int tmp;
int sum=0;
while (n--){
cin>>tmp;
sum += tmp;
}
cout<<sum<<"\n";
}
return 0;
}
7 未知多组+空格隔开的未知多数
输入描述:
- 输入数据有多组, 每行表示一组输入数据。
- 每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:
- 每组数据输出求和的结果
思考:
不知道多少组也不知道组里多少数,我们能把握的就是一组是一行,组内是空格分隔的
- 每组是由
'\n'
区分 - cin自动过滤空格
根据上面的规则,化整为零,while循环条件是输入单个数据
- 在循环体内部,用
cin.get()
继续获取下一个字符- 如果是换行符,则执行输出逻辑
注:
- cin是流对象,>>自动过滤空白符 tab 换行符
- cin.get()得到的是char类型,所以判断
'\n'
用单引号!
#include<bits/stdc++.h>
using namespace std;
int main(){
int cur;
int sum=0;
while (cin>>cur){
sum += cur;
if (cin.get() == '\n'){
cout<<sum<<"\n";
sum = 0;
}
}
return 0;
}
8 n个空格隔开的字符串
输入描述:
- 输入有两行,第一行n
- 第二行是n个字符串,字符串之间用空格隔开
输出描述:
- 输出一行排序后的字符串,空格隔开,无结尾空格
思路:
- 读取n,设置n大小的vector,for 循环n, cin>>
- 输出时,索引i==0时只输出数,其余情况输出空格+数
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vector<string> ans(n);
string tmp;
for (int i=0; i<n; ++i){
cin>>ans[i];
}
sort(ans.begin(),ans.end());
for (int i=0; i<n; ++i){
if (i==0){
cout<<ans[i];
}else {
cout<<" "<<ans[i];
}
}
return 0;
}
9 未知多行+行内空格分开的字符
输入描述:
- 多个测试用例,每个测试用例一行。
- 每行通过空格隔开,有n个字符,n<100
输出描述:
- 对于每组测试用例,输出一行排序过的字符串
- 每个字符串通过空格隔开
思路:
- 化整为零,循环输入单个字符串cur
- 循环体内加入到vector中
- 在函数体内cin.get()=='\n’判断是否换行
- 是,则处理这一行数据的输出逻辑
注:打印的时候注意最后一个字符串后面没有空格
- 是,则处理这一行数据的输出逻辑
- 可以单独写一个printv函数,提高代码可读性
- 还要注意换行
#include<bits/stdc++.h>
using namespace std;
void printv(vector<string>& strs){
for (int i=0; i<strs.size(); ++i){
if (i==0)
cout<<strs[0];
else
cout<<" "<<strs[i];
}
cout<<"\n";
}
int main(){
string cur;
vector<string> strs;
while(cin>>cur){
strs.emplace_back(cur);
if (cin.get() == '\n'){
sort(strs.begin(),strs.end());
printv(strs);
strs.clear();
}
}
return 0;
}
10 未知多行+行内逗号隔开
输入描述:
- 多个测试用例,每个测试用例一行。
- 每行通过,隔开,有n个字符,n<100
输出描述:
- 对于每组用例输出一行排序后的字符串,用’,'隔开,无结尾空格
思考:
- 循环输入str,读入每行
- 对循环体内,首先要根据逗号将str分解为多个”cur“字符串,加入到
vector<string> strs
当中- 遍历str的每个字符str[i],判断是否为逗号
- 否,
cur+=str[i];
- 是,
strs.emplace_back(cur);
,注意还要记得清空cur为后续循环用cur.clear();
- 注意:遍历结束后,重复"是"部分的代码,将没有逗号结尾的最后一组也加入
strs
- 否,
- 遍历str的每个字符str[i],判断是否为逗号
- 得到的
strs
就是我们要处理的输入,随后编写输出逻辑 - 单独写个函数printv( )打印输出
- 注意,最后还要清空strs和cur,进入下一次循环
#include<bits/stdc++.h>
using namespace std;
void printv(vector<string> & strs){
for (int i=0; i<strs.size(); ++i){
if (i==0) cout << strs[0];
else cout<<","<< strs[i];
}
cout<<"\n";
}
int main(){
string str;
vector<string> strs;
string cur;
while (cin>>str){
for(int i=0; i<str.size(); ++i){
if (str[i]!=','){
cur += str[i];
}
else{
strs.emplace_back(cur);
cur.clear();
}
}
strs.emplace_back(cur);
cur.clear();
sort(strs.begin(),strs.end());
printv(strs);
strs.clear();
}
return 0;
}
11 格局、自省
输入描述:
- 输入有多组测试用例,每组空格隔开两个整数
输出描述:
- 对于每组数据输出一行两个整数的和
思考:
- 看到上面简单的情况直接手撕了,但还有错误
- 我又考虑了换行,最后一行不换行,但也错了
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a+b;
while (cin>>a>>b){
cout<<"\n";
cout<<a+b;
}
return 0;
}
正当我怀疑题目出错的时候,我突然意识到自己的盲目性
- 看到整数想都没想直接定义了int整型,但没有考虑其范围
- 题目的范围是:
**当头暴击!!!!**所以,如果自己认为自己写的算法没有问题,测试也没有问题,但是提交还是错误的时候,考虑考虑漏掉了什么corner case,考虑考虑自己选择的变量是不是”格局“小了!!!
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b;
cin>>a>>b;
cout<<a+b;
while (cin>>a>>b){
cout<<"\n";
cout<<a+b;
}
return 0;
}