笔试中的 ACM模式 需要注意的问题

之前一直在leetcode上刷题,核心代码模式用的过于舒适,

笔试前听说是ACM模式,就临时准备了下ACM模式的常用IO方法。

其实常用的不多,本着奥卡姆剃刀原则只写了两个常用的IO方法,足够应付大多数笔试(美团笔试中没有翻车):

1. cin>>x :

  • 自动跳过 tab/space/enter 取数据;
  • 从缓冲区读数据到变量x,而不是从键盘输入读取。(读数据前清空缓冲区: cin.sync();)
用法解析
  1. 输入一个数字或字符
  2. 接收一个字符串(到char数组或string),遇 tab/space/enter 结束,但是并不会吃掉 遇到的 空格/换行符,该空格/换行符还会参与下一次的读取。

2. getline(cin, x)

  • 需要 #include < string> 头文件;
  • 可以读入 SPACE/TAB,遇到ENTER停止读取;且读取完成后会丢弃末尾的换行符
  • getline()函数的全部参数为 getline(istream is,string str,结束符) , 结束符默认是换行符 ‘\n’
  • 当同时使用cin>>,getline()时,需要注意的是,在cin>>读入数据完成之后,如果接下来的字符是换行符,那么在使用 getline()之前需要用getchar()把换行符吞掉,然后再使用getline()读入下一行数据。
    否则,getline()会首先读入换行符,然后停止读取。由于getline()函数会丢弃数据末尾的换行符,因此最终读入的数据为空。

总结:

  • getline()函数遇到换行符后停止,不但读入这个换行符,而且在读取的数据中丢弃它,这样后续的getline()读取就不用考虑这个换行符的存在了。
  • cin>>x 遇到换行符之后停止读取,但是不会读入这个换行符,在接下来的读取中还要考虑到这个换行符的存在;
    因此,如果接下来还是用cin读取,cin会跳过这个换行符继续下一行数据的读取,不会受影响。
    但如果接下来getline()读取数据, 就需要先用getchar() 吃掉这个换行符,以免getline()读入空数据。

可以用acm模式刷题的网站:
https://exercise.acmcoder.com/online/online_judge
牛客网关于ACM模式的输入输出训练:

一些有用的内容:转载自https://blog.csdn.net/a934079371/article/details/108557562

循环输入输出处理常见问题

  1. 为什么需要循环输入输出:通常来说OJ对于每道题里面有.in和.out文件,分别表示测试数据的输入和输出。如果某些编程题的所有数据都只做在一个.in和一个.out中,这样就会变成多组测试了,所以需要提交的代码中循环处理。

  2. 处理方法:其实这个问题可以避免,就是编程题后台每个样例做一组对应的.in和.out文件,这样就变成单组测试,代码就不需要循环处理,但是平时练习的题目质量不一,这个问题都会出现。(有人在阿里笔试中遇到)

  3. 代码里面循环处理了即使是单组测试也会完全没问题,所以为了偷懒,可以全写成循环处理。

  4. 还有一个坑:如果测试数据是多组的,但是恰巧你代码里面需要些标记数组,map,set等,在循环内一定记得清空,不然可能会产生前面的测试样例影响了后续数据的答案。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值