赞
踩
该篇文章将对牛客网刷题中关于输入输出的一些问题作一个总结。每年互联网公司的招聘都必不可少会有算法题,因此平时很多人都会去一些刷题网站进行刷题来学习。这里面用的比较多的刷题网站是leetcode和牛客网。leetcode是一个专门用来刷算法题的网站,里面的算法题覆盖面很广,几乎各方面的编程都有,包括算法,多线程,数据库等,它的特点是题型多并且都有提供官方解答和网友的解答,可以学习得更加方便。在刷算法题时不必担心输入输出数据的问题,因为都是提供一个函数接口,因此练习者只需要实现功能就好了。
牛客网是近些年流行起来的一个招聘网站,当下几乎成为了互联网的求职者必不可缺的资源。一方面,牛客网提供了很多公司的官方招聘信息以及内推信息(员工发帖),可以让大家很方便地查看各大公司招聘信息。另一方面,牛客网提供了更加丰富的刷题系统,里面不但有leetcode的题目库,还有各大公司往年的笔试题,这也为刷题者提供了更宽泛的通道,最后,牛客网还可以在上面发帖,例如面经,求职之类的信息。目前,很多公司的线上面试都用了牛客网的系统,可以在线手撕代码。以上都非常方便大家的学习。但是牛客网的刷题系统大部分都是要自己控制输入输出的,有输入输出的编程就会出现各种格式问题,(说到底在输入输出上出现问题可能还是对语言基础掌握不牢),下面就是一些常见的输入输出问题(如果leetcode刷习惯了,估计会经常采坑)
下面谈到的输入问题其实都建议用while(cin)的形式,最主要的原因是由于牛客网在线编程和实际考试的系统中测试代码用的都是多组测试用例,如果不用while(cin)的形式或许某些情况下会正确,但是用的话基本上都能保证测试的正确性。其实这样也是很正常的,因为代码已经编译运行过了一次,直接在该次运行中进行多组测试即可,无需多次重复编译运行。
几乎所有的输入都是数字或者字符串,根据数字和字符串可以将输入分为几种情况:
先说数字(通常给定一组数,或者给定给一个数组)
(1)直接输入一个数,对该数字进行一些操作,例如判断是否是素数,立方根等,这种类型只需要输入一个数即可,可用以下几种输入:
int N;//定义一个输入变量用于接收系统输入的数字
cin>>N;//方式一,直接输入,再执行相应操作
while(cin>>N){
//方式二,将输入放在while后面,这种方式推荐大家用,因为C++的输入是流的方式,因此用while来判断接收是比较常用的方法,不容易出错(一些情况下只能用这种输入,所以推荐用这种,包括后面的字符串)
}
(2)给定一个数,表示有多少组数(可能是字符和数字的组合)
//举个例子,输入一个数N表示有多少个学生,然后输入每个学生的姓名和学号,要求按学号降序打印每个学生的信息,例子如下: //输入:3 // liming,1410 // zhangsan,1562 // lisi,1355 //输出: // zhangsan,1562 // liming,1410 // lisi,1355 //对于上例,输入一般采用以下的方法 int N;//学生总数 while(cin>>N){ //while里面输入总数,然后在该循环里面处理 for(int i=0;i<N;i++){ //用for循环输入N组数据 cin>>stu[i].name>>stu[i].num;//输入姓名和学号 } } //也可以不用while循环(不推荐,除非用while不好处理或者处理不了) int N; cin>>N; for(int i=0;i<N;i++){ //用for循环输入N组数据 cin>>stu[i].name>>stu[i].num;//输入姓名和学号 } //这种方式看似很直观易懂,但这种方式对于系统里的测试用例来说可能不太友好,一般C++的输入都强调流的概念,这种方式只能某些情况下可以使用,大家可以自己多刷一刷,就会发现这种方式经常会遇到莫名其妙的错误
(3)可能直接就是要求输入一组数,并不告知具体的数量,以(2)的例子为例,如果不告诉你多少个学生,你就无法根据学生数量用for循环输入了,这时候用while循环就可以很好地处理(流的处理模式)
string name;//定义姓名变量
int num;//定义学号变量
while(cin>>name>>num){//输入一组,处理一组
student s = {name,num};
Input.push_back(s);//用一个结构体数组来接收输入的学生信息即可
//....
}
再说字符(串)(很常见)
(1)给定字符(串),进行相关地处理
//给定字符
char ch;
cin>>ch;//方式一
while(cin.get(ch))//方式二
//给定字符串
string input;
getline(cin,input);//方式一
cin>>input;//方式二
while(方式一/方式二) //方式三
//还是推荐用方式三的输入方式,不容易出错,字符串的一些题目用方式一和方式二可能会出错(由于输入格式的问题)
(2)给定不止一组字符串,告知大小
//举个例子,先输入一个数表示有多少个字符串,再输入每个字符串,根据字符串长度排序 int N;//定义数量 string temp;//字符串变量 while(cin>>N){ //输入数量 vector<string> input; //存储所有的字符串 for(int i=0;i<N;i++){ cin>>temp; //输入字符串 input.push_back(temp);//保存 } } //下面是另一种不安全的写法 int N;//定义数量 cin>>N;//输入数量 string temp;//字符串变量 vector<string> input; //存储所有的字符串 for(int i=0;i<N;i++){ cin>>temp; //输入字符串 input.push_back(temp);//保存 } //以该例题为例,可能在本地IDE能得到正确答案,但如果是牛客网系统,由于输入格式的问题,这样写编译会通过,就是得不到正确答案
(3)输入一组字符串,不告知大小,仍然以上个例子举例,不告诉你有多少字符串,这样就不能根据数量来用for循环做了,但可以用while循环处理
string temp;//字符串变量
vector<string> input; //存储所有的字符串
while(cin>>temp){ //输入数量
input.push_back(temp);//保存
//...
}
C++的输出cout与输入cin一样都是用流来控制的,cin和cout都在iostream这个头文件中,命名空间为std,因此使用的时候都要加上头文件和命名空间。输出相对来说简单一些,不会出现输入的一些问题,相反,cout输出有时候还可以帮助你解决题目,一下列举一些常见输出语句:
//输入一个数字再输出 int num;//定义 cin>>num;//输入 cout<<num<<endl;//输出并且换行 //输入一个字符串再输出 string input;//定义 cin>>input;//输入 cout<<input<<endl;//输出并且换行 //输入输出多个数据 int num1,num2; string s1,s2; cin>>num1>>s1; cin>>num2>>s2; cout<<num1<<s1<<' '<<num2<<s2<<endl;
牛客网刷题应该对于互联网求职者来说必不可少,因为很多公司都用的这个线上系统,因而用到了其刷题的系统。实际手撕代码就是一片空白的场景下自己写头文件,写命名空间,写输入输出等,很多人在实际笔试或者面试时都吃了输入输出的亏,所以这个还是要平时多练习,多总结,把一些常见的输入输出格式都弄清楚很重要
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。