返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >ACM模式输入输出攻略 | C++篇
  • 652
分享到

ACM模式输入输出攻略 | C++篇

c++java开发语言 2023-08-20 10:08:37 652人浏览 八月长安
摘要

文章目录 ACM模式输入输出攻略 | C++篇1.核心代码模式与ACM模式2.C++常用的输入输出方法2.1 输入(1)cin(2)getline()(3)getchar() 2.2 输出 3.案例(1)一维


ACM模式输入输出攻略 | c++

大家好,这里是小黛~

三月开始,就会陆续开启各大公司暑期实习的笔试和面试,而笔试中,ACM模式是必须要去熟练掌握的,今天就来针对ACM模式进行详细介绍。

这个系列首先以C++为例,进行ACM模式的讲解,后续会补齐JAVA、Gojs等常用语言的输入输出案例。

本文主要介绍五个方面:

第一是介绍核心代码模式ACM模式,以及笔试面试的常见场景。

第二是介绍**C++**中常用的输入输出函数

第三是以笔试面试中常见的输入为例,进行代码层面案例介绍

第四是给出一些练习ACM模式的平台

第五是把常见的数据结构定义,输入和输出展示出来,主要是链表二叉树

1.核心代码模式与ACM模式

当我们刷算法题的时候,比如力扣、牛客这些网站,很多的题目只需要我们写出函数体(核心代码),平台就可以自动帮助我们补齐输入输出,进行调试,但,在笔试和面试中,往往需要自己写出可以运行的完整代码(ACM模式),这个时候,需要我们去了解一下自己所使用的语言下的输入输出如何去设计。

首先给出几个注意事项:

笔试平台用的比较多的,比如牛客,赛码,可以提前去熟悉熟悉上面的操作。

有些笔试,需要自己写输入输出,有些,则不需要,但我们必须要把输入输出搞懂,这样就不怕是什么类型的笔试了,而且输入输出本身是不难的,学习一下就可以完全掌握。最好不要出现,算法题的核心思路会写,卡在了输入输出上,这样就很难受了。

有些笔试,还会让大伙自己设计测试用例,这个平时练习的时候也可以注意一下,主要核心的思想就是测试用例设计的几个原则。

不仅仅是笔试,有些面试,也会要求你写输入输出测试用例

面试手撕代码的几种形式:

1.平台类

去面试官给定的平台上去面试,上面可以编写代码,调试和运行,这些平台有的写好了函数框架,有的是白板,需要自己写全部内容

2.自己的IDE

面试官要求候选人打开自己的ide,并共享桌面进行编写,这种肯定是要自己写全输入输出了

3.要求补齐测试用例

有些面试官,比如微软的面试官,可能会让你写完代码后,自己设计尽可能全面的测试用例,对你编写的代码进行测试。

2.C++常用的输入输出方法

C++的输入输出有很多种方式,既有继承自C语言的,也有其自己独特的。这里呢,不会把全部输入输出函数进行罗列,只会介绍几个在笔试面试中经常被用到的,我认为,掌握这几个足够了,如果有余力,可以去官方文档查看更多关于输入输出的函数进行深度学习

2.1 输入

首先,在C++语言中,要使用标准的输入,需要包含头文件

(1)cin

cin是C++中, 标准的输入流对象,下面列出cin的两个用法,单独读入,和批量读入

cin的原理,简单来讲,是有一个缓冲区,我们键盘输入的数据,会先存到缓冲区中,用cin可以从缓冲区中读取数据。

注意1:cin可以连续从键盘读入数据

注意2:cin以空格、tab、换行符作为分隔符

注意3:cin从第一个非空格字符开始读取,直到遇到分隔符结束读取

示例:

// 用法1,读入单数据int num;cin >> num;cout << num << endl;  // 输出读入的整数num// 用法2,批量读入多个数据vector nums(5);for(int i = 0; i < nums.size(); i++) {cin >> nums[i];}// 输出读入的数组for(int i = 0; i < nums.size(); i++) {cout << nums[i] << " ";}

(2)getline()

从cin的注意中,也可以看出,当我们要求读取的字符串中间存在空格的时候,cin会读取不全整个字符串,这个时候,可以采用getline()函数来解决。

注意1:使用getline()函数的时候,需要包含头文件

注意2:getline()函数会读取一行,读取的字符串包括空格,遇到换行符结束

示例:

string s;getline(cin, s);// 输出读入的字符串cout << s << endl;

(3)getchar()

该函数会从缓存区中读出一个字符,经常被用于判断是否换行

示例:

char ch;ch = getchar();// 输出读入的字符cout << ch << endl;

2.2 输出

同样的,在C++语言中,要使用标准的输出,也需要包含头文件

输出这边,主要介绍一个函数,就是用的最多的cout,需要注意的是,如果输出endl对象的时候,会输出一个换行符,类似\n

示例:

string s = "hello, Irray~";// 看看二者有何不同cout << "hello, Irray~";cout << s << endl;

当然,C++中的输入输出函数不止这几个,其他的输入函数包括scanf()cin.get()等等方式,输出函数也有printf()clogcerr等方式,要根据具体的使用场景,选择具体的输入输出函数。

但,接下来的案例中,掌握上述三个方法是足够的。不想介绍太多,也是因为,记忆太多方法,容易记混,不如用最简洁的方式实现全部问题。

3.案例

(1)一维数组

此类输入,每个元素为一个int或者char,有两类常见的案例:

1.固定数目

输入格式:
31 2 3

or

3 1 2 3
解析:

对于第一组,第一行的3为整数的个数,第二行为三个用空格隔开的整数,因此可以采用cin来进行读取

对于第二组,第一行的3为整数的个数,空格后面的数据为三个用空格隔开的整数,因此可以采用cin来进行读取

此类问题,可以先创建一个vector,大小设置为给定值,然后通过for循环来循环输入

答案:
int n;cin >> n; // 读入3,说明数组的大小是3vector nums(n); // 创建大小为3的vectorfor(int i = 0; i < n; i++) {cin >> nums[i];}// 验证是否读入成功for(int i = 0; i < nums.size(); i++) {cout << nums[i] << " ";}cout << endl;

2.不固定数目

输入格式:
1 2 3 4
解析:

输入的数据为四个用空格间隔的整数,没有指定整数个数,因此可以用while循环结合cin来处理该问题。

答案:
vector nums;int num;while(cin >> num) {nums.push_back(num);// 读到换行符,终止循环if(getchar() == '\n') {break;}}// 验证是否读入成功for(int i = 0; i < nums.size(); i++) {cout << nums[i] << " ";}cout << endl;

(2)二维数组

除了一维数组这种最基础的输入外,还会考察二维数组的输入,尤其是在dfs、dp类型的题目中。

二维数组主要有两种方式:

1.常规模式

输入格式:
2 31 2 31 2 3
解析:

第一行的2,代表数据为2行,3代表数据为3列,因此根据第一行,可以得出,所输入数据为2行3列的二维数组。接下来的6个数字,就是按照空格和换行符分隔开的2x3二维数组,因此用for循环和cin即可处理

答案:
int m; // 接收行数int n; // 接收列数cin >> m >> n;vector> matrix(m, vector(n));for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {cin >> matrix[i][j];}}// 验证是否读入成功for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {cout << matrix[i][j] << " ";}cout << endl;}

2.每一行数据是逗号隔开的整数

输入格式:
2 31,2,31,2,3
解析:

第一行的2,代表数据为2行,3代表数据为3列,因此根据第一行,可以得出,所输入数据为2行3列的二维数组。接下来的2行,分别是一个字符串,字符串中用逗号隔开每个整数。这里采用读入字符串的方式,并将读入的字符串进行按逗号分开。

答案:
int m; // 接收行数int n; // 接收列数cin >> m >> n;vector> matrix(m);for(int i = 0; i < m; i++) {    // 读入字符串string s;getline(cin, s);// 将读入的字符串按照逗号分隔为vectorvector vec;int p = 0;for(int q = 0; q < s.size(); q++) {p = q;while(s[p] != ',' && p < s.size()) {p++;}string tmp = s.substr(q, p - q);vec.push_back(stoi(tmp));q = p;}//写入matrixmatrix[i] = vec;vec.clear();}// 验证是否读入成功for(int i = 0; i < matrix.size(); i++) {for(int j = 0; j < matrix[i].size(); j++) {cout << matrix[i][j] << " ";}cout << endl;}

(3)字符串

1.单字符串

输入格式:
abc
解析:

cin读入即可

答案:
string s;cin >> s;// 验证是否读入成功cout << s << endl;

2.给定数目多字符串

输入格式:
3 abc ab a
解析:

第一行的3,代表有3个字符串,后续为用空格隔开的3个字符串,采用for循环和cin读入即可

答案:
int n;cin >> n; // 读入3,说明字符串数组的大小是3vector strings(n); // 创建大小为3的vectorfor(int i = 0; i < n; i++) {cin >> strings[i];}// 验证是否读入成功for(int i = 0; i < strings.size(); i++) {cout << strings[i] << " ";}cout << endl;

3.不给定数目多字符串

输入格式:
abc ab a d
解析:

输入为用空格隔开的若干个字符串。

答案:
vector strings;string str;while(cin >> str) {strings.push_back(str);// 读到换行符,终止循环if(getchar() == '\n') {break;}}// 验证是否读入成功for(int i = 0; i < strings.size(); i++) {cout << strings[i] << " ";}cout << endl;

4.字符串转整数数组

输入格式:
11,22,3,4
解析:

输入为一个完整字符串,字符串内容是按照逗号隔开的一个数组,可以先读入完成字符串,然后根据逗号进行分隔

答案:
vector vec;// 读入字符串string s;getline(cin, s);// 将读入的字符串按照逗号分隔为vectorint p = 0;for(int q = 0; q < s.size(); q++) {p = q;while(s[p] != ',' && p < s.size()) {p++;}string tmp = s.substr(q, p - q);vec.push_back(stoi(tmp));q = p;}// 验证是否读入成功for(int i = 0; i < vec.size(); i++) {cout << vec[i] << " ";}cout << endl;

4.ACM模式练习平台

除了在笔试中实战之外,也可以在牛客平台进行练习:https://ac.nowcoder.com/acm/contest/5652

同时,牛客上也有很多专门的ACM模式算法题。

这里给出一个案例:

题目来源:Https://ac.nowcoder.com/acm/contest/5652/A

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

**输出:**输出a+b的结果

示例:

1)输入

1 510 20

2)输出

630

解答:

因为比较简单,就直接给出代码了。

#include using namespace std;int main() {    int a;    int b;    while(cin >> a >> b) {        cout << a + b << endl;    }        return 0;}

5.常见数据结构定义

在ACM模式中,链表、二叉树这些数据结构的定义也需要自己去定义,接下来就给出二者的定义、输入和输出。

这里就直接给出代码了,想必大伙对数据结构都是了如指掌的。

1.链表

#include using namespace std;// 链表定义,并给出两个有参构造函数struct ListNode{    int val;    ListNode* next;    ListNode(int _val):val(_val),next(nullptr){}    ListNode(int _val,ListNode* _next):val(_val),next(_next){}};int main(){// 根据控制台的输入,创建一条单链表    ListNode* LHead = new ListNode(-1);    ListNode* pre = LHead;    ListNode* cur = nullptr;        int num;    while(cin >> num)    {    // 为了简单起见,设置为-1退出,后续可优化,这里只是给出一个例子        if(num == -1) break;        cur = new ListNode(num);        pre->next = cur;        pre = cur;    }        cur = LHead->next;        // 输出单链表的value    while(cur)    {        cout << cur->val << " ";        cur = cur->next;    }        cout << endl;        return 0;}

2.二叉树

#include #include #include using namespace std;//定义树节点struct Treenode{    int val;    TreeNode* left;    TreeNode* right;    TreeNode():val(0),left(nullptr),right(nullptr){}    TreeNode(int _val):val(_val),left(nullptr),right(nullptr){}    TreeNode(int _val,TreeNode* _left,TreeNode* _right):val(0),left(_left),right(_right){}};//根据数组生成树TreeNode* buildTree(const vector& v){    vector vTree(v.size(),nullptr);    TreeNode* root = nullptr;    for(int i = 0; i < v.size(); i++)    {        TreeNode* node = nullptr;        if(v[i] != -1)        {            node = new TreeNode(v[i]);        }        vTree[i] = node;    }    root = vTree[0];    for(int i = 0; 2 * i + 2 < v.size(); i++)    {        if(vTree[i] != nullptr)        {            vTree[i]->left = vTree[2 * i + 1];            vTree[i]->right = vTree[2 * i + 2];        }    }    return root;}//根据二叉树根节点层序遍历并打印void printBinaryTree(TreeNode* root){    if(root == nullptr) return;    vector> ans;    queue q;    q.push(root);    while(!q.empty())    {        int size = q.size();        vector path;        for(int i = 0;ival);                q.push(node->left);                q.push(node->right);            }        }        ans.push_back(path);    }        for(int i = 0;iain(){// 验证    vector v = {4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8};    TreeNode* root = buildTree(v);    printBinaryTree(root);        return 0;}

欸嘿嘿,终于写完了!!!

本文内容干货非常非常多,从笔试面试环境的要点,到C++输入输出的具体函数,再到几乎覆盖全部情况的ACM模式写法,最后也给出了链表和二叉树的定义和输入输出。

全文代码都在本地IDE跑过,也都是本人今天亲手敲出来的,觉得有收获的可以点赞一波。

想和小黛一起交流的,也欢迎私聊,改简历、求职指导、模拟面试都是可以的哈~~~也有小窝,可以加我,我拉你哦

本人23年秋招拿了政策行总行、百度sp,美团,中国银行总行,中国银联总部等25个offer,非常欢迎小伙伴和我交流哇,改简历,学习计划,笔试面试经验,免费免费免费~~想来交流的随时私聊我哈

来源地址:https://blog.csdn.net/qq_46046431/article/details/129266738

--结束END--

本文标题: ACM模式输入输出攻略 | C++篇

本文链接: https://lsjlt.com/news/376357.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ACM模式输入输出攻略 | C++篇
    文章目录 ACM模式输入输出攻略 | C++篇1.核心代码模式与ACM模式2.C++常用的输入输出方法2.1 输入(1)cin(2)getline()(3)getchar() 2.2 输出 3.案例(1)一维...
    99+
    2023-08-20
    c++ java 开发语言
  • ACM模式常见输入输出专题(Java版)
    目录 题号A: A+B(1) 题号B: A+B(2) 题号C: A+B(3) 题号D: A+B4) 题号E: A+B(5) 题号F: A+B(6) 题号G: A+B(7) 题号H: 字符串排序(1) 题号I 字符串排序(2) 题号G: 字...
    99+
    2023-09-15
    java 开发语言
  • 【精华】ACM八大输入输出格式之Pyth
    感谢细胞学长提供的帮助,此处应有传送门:说吧,记忆 - 博客频道 - CSDN.NET 根据杭电的那篇教程写的,现在博客里面再存一篇 # encoding: utf-8 ''' Created on Nov 6th, 2014 @a...
    99+
    2023-01-31
    输入输出 格式 精华
  • C++的输入与输出和格式化输出
    目录一、C++ 输入与输出 格式化输出1.cin与cout2.格式化输出2.1设置域宽及位数2.2按进制输出2.3设置填充符总结一、C++ 输入与输出 格式化输出 1.cin与cou...
    99+
    2024-04-02
  • C++ stringstream格式化输出输入分析
    这篇文章主要讲解了“C++ stringstream格式化输出输入分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++ stringstream格式化输出输入分析”吧!目录最近在笔试时经...
    99+
    2023-06-25
  • C++ stringstream格式化输出输入详情
    目录最近在笔试时经常遇见各种输入问题,于是细心总结一波;首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空...
    99+
    2024-04-02
  • C++输入输出(cin和cout)
    在C语言中,我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在C++语言中,C语言的这一套输入输出库我们仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库。【例1】简单的输入输出代码示例:#inclu...
    99+
    2023-06-03
  • Java中的输入输出方式
    文章目录 前言一、输出到控制台二、从键盘输入 前言 学过C语言的都是知道,在C语言中,输入用scanf()函数,输出用printf。那么,Java中,输入输出的方式是怎样的呢?这篇文章,...
    99+
    2023-09-24
    java 开发语言
  • C++的输入和输出流详解
    目录输入和输出流标准输入流小案例标准输出流文件读写总结输入和输出流 从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。 从磁盘文件输入数据,数据输出到...
    99+
    2024-04-02
  • c++输入输出语句有哪些
    c++输入输出语句有:1、scanf()语句,用于读取从键盘输入的数据;2、printf()语句,用于向标准输出设备输出指定的格式信息;3、cout语句,表示标准输出,使用cout进行输出时需要紧跟“<<”运算符;4、cin语句...
    99+
    2023-05-14
    输入输出 c++
  • Pytorch-LSTM输入输出参数方式
    目录1.Pytorch中的LSTM中输入输出参数2.输入数据(以batch_first=True,单层单向为例)3.输入数据(以batch_first=True,双层双向)Pytor...
    99+
    2024-04-02
  • Node.js用readline模块实现输入输出
    什么是Readline Readline是Node.js里实现标准输入输出的封装好的模块,通过这个模块我们可以以逐行的方式读取数据流。使用require("readline")可以引用模块。 如何使用Re...
    99+
    2022-06-04
    输入输出 模块 Node
  • c++输入输出语句怎么使用
    这篇文章主要介绍了c++输入输出语句怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c++输入输出语句怎么使用文章都会有所收获,下面我们一起来看看吧。c++输入输出语句有:1、scanf()语句,用于读取...
    99+
    2023-07-05
  • C++char类型和输入输出优化
    目录1、char类型2、getchar、putchar、cin.get、cout.put3、输入输出中文1、char类型 char的全称是character,也就是字符的意思。顾名思...
    99+
    2024-04-02
  • c++中输入输出语句怎么写
    c++ 中通过 cin 和 cout 进行输入和输出。输入使用 cin &gt;&gt;,根据指定数据类型从标准输入读取数据。输出使用 cout C++ 中的输入输出...
    99+
    2024-05-01
    c++
  • C++格式控制符scanf与printf的输入输出方法
    这篇文章主要介绍“C++格式控制符scanf与printf的输入输出方法”,在日常操作中,相信很多人在C++格式控制符scanf与printf的输入输出方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++...
    99+
    2023-06-30
  • 【C++入门系列】——命名空间和输入输出
    ​作者主页 📚lovewold少个r博客主页    ⚠️本文重点:c++入门第一个程序和基本知识讲解 😄每日一言:忙,不会死,人只有越忙越活,流水不腐,户枢不蠹。 目录 ​作者主页 前言 谈谈...
    99+
    2023-10-18
    c++
  • 【C++深入浅出】初识C++上篇(关键字,命名空间,输入输出,缺省参数,函数重载)
         目录 一. 前言 二. 什么是C++ 三. C++关键字初探 四. 命名空间 4.1 为什么要引入命名空间 4.2 命名空间的定义 4.3 命名空间使用 五. C++的输入输出 六. 缺省参数 6.1 缺省参数的概念 6.2 缺...
    99+
    2023-09-02
    c++ 开发语言 笔记 函数重载 缺省参数 命名空间
  • C++输入流和输出流 超级详细
    目录1、简单介绍2、C++输入流和输出流1、简单介绍 C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语...
    99+
    2024-04-02
  • C++输入和输出流的示例分析
    这篇文章给大家分享的是有关C++输入和输出流的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。输入和输出流从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。从磁盘文件输入数据...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作