第一次用赛码网,两个小时的笔试居然有一个半小时在查如何正确输入,最要命的是在本地IDE上可以的输入到了网页上就GG了。看来是leetcode刷多了,文件流那块学的也很糟糕。总结一下下次避免跳坑吧。一行的就不说了,用一个多行输入做例子。

6
beijing nanjing
nanjing shanghai
shanghai wuhan
wuhan beijing
xiamen tianjin
tianjin xiamen

题目大意:

小团多次旅游归来,第一行表示他买过的票的总数n;
后面按时间顺序排好这些票,且小团的出游出发地是不固定的,但最后他一定会回到出发的地方,代表他结束了本次旅游。
那么
beijing nanjing
nanjing shanghai
shanghai wuhan
wuhan beijing
xiamen tianjin
tianjin xiamen

就代表了小团进行了两次旅游

算法非常简单,然鹅我被这个输入浪费了一个小时。

分析:

6是6行,也就是六张票。目标是将每个城市名单独存放,这样考虑使用vector存放string。
cin遇到空格时,认为输入无效,继而执行后面的语句。

cin遇到换行符与空格和tab时结束读取,例如下面的代码:
string str;
cin >> str;
cout << str;
输入:abcdefg hijk

输出结果将会是:abcdefg

分析一下,cin会根据你定义的数据类型,从输入流中读进去一个该类型数据,直到满足要求或者遇到空格 换行等后完成该次输入。所以用

string s;
cin>>s;

来实现以string类型数据为单位的读取操作。

#include <iostream>
#include<vector>
#include<cstring>
#include<string>
#include<sstream>
int main()
{int n;cin >> n;vector<string> store;string s;char a;while (store.size()<2 * n&&cin >> s) {store.push_back(s);s.clear();if (store.size() == 2*n)break;}
}

最后的问题解答,全AC,然后做完这个就没时间了哈哈

#include <iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;int main()
{int n;cin >> n;vector<string> store;string s;while (store.size()<2 * n&&cin >> s) {store.push_back(s);s.clear();if (store.size() == 2*n)break;} int count = 1;for (int i = 2; i < 2*n; i = i + 2) {if (store[i] != store[i - 1])count++;}cout << count << endl;return 0;
}

输入流的使用分析

这可能是今天笔试的最大收获了吧

假如我们要输入一个char型:
1.直接复制一个count后,无反应,需要按一下回车,只有c被读入a中。
2.手打,输入c后无反应,可再输入多个字符,遇空格无反应,还需要回车。
故复制和手敲输入在这里没啥区别。。
那么遇空格无效到底怎么理解呢?
输入缓冲机制

这个缓冲机制规定,只有收到回车键,才会将所有输入的数据一次过提交到输入处理函数(就是 cin 或者 scanf 了)
而这个输入过程,在按下回车键之前,是不受到 cin 和 scanf 控制的…


2.所以说,回车是将输入送到缓冲区,cin再从中读取,其读取过程就和回车无关了。读取的原则就是遇到换行 空格时结束本次读取。
顺便说下换行和空格的区别。再不同编译器,不同系统中,两者的表示不尽相同。我们在赛码网上复制用例时,每行后面其实跟了个换行符‘\r\n’.
如果你认真看了前文,你肯定也会轻松的明白,不管是你输完一行后手动回车,还是直接复制用例(里面包含了换行),起到的效果时一样的。但还是有必要说一下回车换行的区别。

这一部分主要参考这里
https://www.cnblogs.com/dawn-l/p/5180373.html
C/C++ 中,回车符 '\r' 仅表示回到行首,并没有包含换行的动作,换行是由 '\n' 来完成的,初学者一定要分清这两个符号的意义
这里再提一个与 ‘\r’ ‘\n’ 类似的一个转义字符:退格(BS, Backspace)’\b’,顾名思义,这个字符的意义是往前退一格,这里需要特别提醒的是:退格 ‘\b’ 和回车 ‘\r’ 都只是光标的移动,不会删除前面的文本!

现在让我们用一段简单的代码来验证 ‘\r’ ‘\n’ ‘\b’ 的作用效果。

C代码:

 1 #include <stdio.h>2 3 int main(int argc, char const *argv[])4 {5     printf("abc\r\ncba\rrr\bz\n");6     printf("abcd\b\b");7     getchar();8 9     return 0;
10 }

C++代码:

#include <iostream>int main(int argc, char const *argv[])
{using namespace std;cout << "abc\r\ncba\rrr\bz\n";cout << "abcd\b\b";cin.get();return 0;
}

首先我们看下输出的第一行 “abc\r\ncba\rrr\bz\n”:

1.在输出 abc 后 \r 使回车符回到当前行即第一行的行首,但不删除字符,所以第一行最终显示 abc,然后 \n 使光标移到下一行,接着输出 cba,\r再次让光标回到行首,这次不换行,直接接着输出 rr,这样达到的效果是行首两个字符 cb 被替换为 rr,接着 \b 使光标向前一位,输出 z,这样第二个 r 就被换成了 z,然后换行,最终第二行显示结果就是 rza。

2.接着为了更直观地证明只有光标移动而不删除字符,我们看看第二行代码。“abcd\b\b”,在两个 \b 过后,光标向前移动到 c 的下面(或者是 c 上的方块光标,亦或是在 c 前的 I 形光标),为了使光标停留以便观察,我们添加了 getchar() 和 cin.get()。

所以程序运行后的结果将是

abc
rza
abcd

同时可以看到光标停留在上述位置,当然,这时如果你再输入字符,就会从光标的位置开始向后将 c 甚至 d 覆盖。

哈哈是不是很有意思,这些基础知识有时不太重视,但却很致命。

介绍另一种输入形式:
用getchar()读取一行,通用形式:(这种方法会把空格也读进去

char ch;
while ((ch = getchar()) != '\n')
{...
}

做一下小实验,a里面存的是’\n’,没有’\r’,这点要注意!!

改进一下,要是要用getchar()来满足今天笔试题的输入需求,将同一行用空格分开的两个地名分别存起来呢?
方法是这样的,注意最后判断a是’\n’来结束本次输入。

 char a;string s;while (a = getchar()) {if(a !='\n'&& a !=' ')s += a;else {cout << "刚才输入了:" << s << endl;s.clear();if (a == '\n')break;}}

读取多行:(加for循环就行,这是不管空格的简化版本,不太符合我们的需求)

 char a;string s;for (int i = 0; i < 6; i++) {while ((a = getchar()) != '\n')s += a;cout <<"刚才输入了:"<< s << endl;s.clear();}


改进一下 OJBK!!

 char a;string s;for (int i = 0; i < 3; i++){while (a = getchar()) {if (a != '\n'&& a != ' ')s += a;else {cout << "刚才输入了:" << s << endl;s.clear();if (a == '\n')break;}}}

3还有getline(cin,s)这个函数,直接读一行,也是不管空格,感觉在某些场景下挺好用。不再赘述。

8.15美团笔试和奇葩赛码网的输入坑相关推荐

  1. vscode配置本地使用赛码网的输入输出格式编写代码

    首先创建本地文件夹,将本地文件夹在vscode终端打开. 1.安装readline-sync npm install readline-sync 正常情况下运行上面的代码,会出现警告信息: 根据提示, ...

  2. 牛客网赛码网 输入输出格式

    目录 牛客网&赛码网输入输出 牛客网 单行输入 多行输入,每一行是一个测试样例 多个测试用例,每个测试用例有多行 赛码网 单个输入,单个输出 单行多个输入,单行多个输出,空格分割 多个测试案例 ...

  3. 赛码网算法: 上台阶 ( python3实现 、c实现)

    上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=1 ...

  4. 赛码网输入输出总结+真题演练

    赛码网输入输出总结 前言 类型一:测试组数不固定,每组三行数据 踩坑记录1 踩坑记录2 类型2 测试组数不定,输入数据中有指定行数的多行输入(赛码网找老乡题最完美答案) 类型三:一组数据,有指定行数的 ...

  5. 牛客网赛码网输入输出总结(python版)

    1. 单行输入: n, m = map(int, sys.stdin.readline().strip().split()) 对该行中所有元素取整型后赋给等式左边若干参数 2. 多行输入: 先获取第一 ...

  6. 牛客网赛码网 输入输出格式 pythonC++

    牛客网&赛码网 输入输出格式 python&C++ Note: 你的程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果,举个例子,你可以使用c语言的scan ...

  7. 【赛码网 牛客网】输入输出总结(python版)

    1. 单行输入 n, m = map(int, sys.stdin.readline().strip().split()) 对该行中所有元素取整型后赋给等式左边若干参数 2. 多行输入: 先获取第一行 ...

  8. js牛客网、赛码网输入输出

    js牛客网.赛码网输入输出 牛客网在线判题系统JavaScript(V8)使用 输入 单行输入 只有一行输入或者一个 var line = read_line(); 只有一行数组 var line = ...

  9. 牛客网 赛码网 js输入输出

    牛客网 详细地址 let readline = require('readline') const r1 = readline.createInterface({input: process.stdi ...

  10. 赛码网: 小明很喜欢打字,今天小红给了小明一个字符串。

    题目 时间限制: 3000MS 内存限制: 589824KB 题目描述: 小明很喜欢打字,今天小红给了小明一个字符串. 这个字符串只包含大写和小写字母. 我们知道,按下CapsLock键,可以切换大小 ...

最新文章

  1. 树莓派 ROS 段错误
  2. 几种常用编程语言的编程思想和方法 转
  3. 死磕Java并发:Java内存模型之分析volatile
  4. 如何用html5定位,如何利用html5进行地理定位
  5. Java8 Time
  6. 【BZOJ 2119】 2119: 股市的预测 (后缀数组+分块+RMQ)
  7. 从浏览器市场份额,探究百度在移动互联网时代失败的原因
  8. Windows 2000缓冲区溢出技术原理
  9. 3-7:类与对象下篇——static成员
  10. Linux平台中使用PHP让word转pdf
  11. 【转载】关于网页尺寸的设置
  12. asp fso的神奇功能
  13. 期货价格与即期价格?
  14. Linux学习12—文件服务
  15. C双拼输入法使用说明
  16. 手机组态软件 APP监控台达PLC C#全套源代码
  17. 屏蔽 已阅读59% 前往新浪新闻查看全文
  18. laypage分页java例子_基于LayUI分页和LayUI laypage分页的使用示例
  19. 第二类斯特林数 - Push Botton Lock(POJ 3088)
  20. 思绪,飘在青山绿水间

热门文章

  1. 优酷搞笑--万万没想到--台词
  2. 趣图:没想到 CSS 深灰色是这样的
  3. POJ3295 Tautology(栈+思路详解)
  4. Spring boot 2 雷神
  5. Hills And Valleys(贪心/枚举)
  6. 无线数据包的破解——跑包
  7. Codeforces407C Curious Array
  8. java双开_修改Android源码实现原生应用双开,应用多开
  9. linux sed -i 命令
  10. 英国部份城市中英文对照