牛客C++笔试ACM模式输入输出练习

平时用力扣刷题,换成牛客这种需要打印输出结果对比判定的OJ不是很习惯,所以特别练习一下。尤其是对于8、9、10部分关于字符串的。

”纸上得来终觉浅,绝知此事要躬行“:练习代码

注意:变量在定义时最好就初始化,防止意想不到的bug

文章目录

    • 1 不知道多少组
    • 2 已知输入组数
    • 3 未知多组+结束条件+0结束
    • 4 未知多组+组内给定n数据
    • 5 t组输入+组内给定n数据
    • 6 未知多组+组内n数据
    • 7 未知多组+空格隔开的未知多数
    • 8 n个空格隔开的字符串
    • 9 未知多行+行内空格分开的字符
    • 10 未知多行+行内逗号隔开
    • 11 格局、自省

1 不知道多少组

输入:

  • 输入包括两个正整数a,b(1 <= a, b <= 1000),输入数据包括多组。

输出:

  • 输出a+b的结果

分析:

  • 不知道具体有多少组,所以外层的while循环应该在接收不到输入时停止
    • while(cin>>a>>b)
  • 每一组结果之间要换行
    • cout<
#include
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<

#include
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
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
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
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
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
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
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
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 strs当中
    • 遍历str的每个字符str[i],判断是否为逗号
      • 否,cur+=str[i];
      • 是,strs.emplace_back(cur);,注意还要记得清空cur为后续循环用 cur.clear();
      • 注意:遍历结束后,重复"是"部分的代码,将没有逗号结尾的最后一组也加入strs
  • 得到的strs就是我们要处理的输入,随后编写输出逻辑
  • 单独写个函数printv( )打印输出
  • 注意,最后还要清空strs和cur,进入下一次循环
#include
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
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
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;
}

你可能感兴趣的:(数据结构和算法,C++排雷,配置,c++,算法,数据结构)