牛客網的刷題系統大部分都是要自己控制輸入輸出的,有輸入輸出的編程就會出現各種格式問題,(說到底在輸入輸出上出現問題可能還是對語言基礎掌握不牢),
下面就是一些常見的輸入輸出問題(如果leetcode刷習慣了,估計會經常采坑)
while(cin)說明
下面談到的輸入問題其實都建議用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;
小結
牛客網刷題應該對於互聯網求職者來說必不可少,因為很多公司都用的這個線上系統,因而用到了其刷題的系統。
實際手撕代碼就是一片空白的場景下自己寫頭文件,寫命名空間,寫輸入輸出等,很多人在實際筆試或者面試時都吃了輸入輸出的虧,所以這個還是要平時多練習,多總結,把一些常見的輸入輸出格式都弄清楚很重要。
示例代碼:
#include <iostream> using namespace std; int main() { int a,b; while(cin >> a >> b)//注意while處理多個case cout << a+b << endl; }
轉自:https://blog.csdn.net/Inthesilence/article/details/107448234
備忘學習
leetcode算法題,常用頭文件:
#include <iostream> #include <istream> //基本輸入流 #include <ostream> //基本輸出流 #include <algorithm> #include <cmath> #include <string> #include <vector> #include <iterator> #include <queue> //STL隊列容器 #include <set> //STL 集合容器 #include <stack> //STL 堆棧容器 #include <map> //STL map容器 using namespace std;
https://blog.csdn.net/weixin_43916296/article/details/86584528
還有可以一次行包含所有C++頭文件的方式:
#include <bits/stdc++.h>
相關總結如下:包括pyhton的輸入輸出
https://blog.csdn.net/qq_38906523/article/details/79823057
C++ 常用數據結構和操作:
https://blog.csdn.net/qq_40589781/article/details/104397511