爲了準備應聘過程當中的機試環節,找了些OJ機試題來作作。看了帖子http://www.cnblogs.com/whc-uestc/p/4733992.html後用本身的方法對三道華爲機試題進行了編寫。html
題1ios
#include <iostream> #include <string> #include <vector> using namespace std; int getmax(vector<int> vec, int a, int b) { int max=0; for(int i=a-1;i<=b-1;i++) { if(max<vec[i]) { max=vec[i]; } } return max; } int main(){ //vector<Log> vec; //Log lg; //while(cin>>lg.path>>lg.row){ // writeLog(vec,lg); //} //for(int i=0; i<vec.size(); i++) // cout<<vec[i].path<<" "<<vec[i].row<<" "<<vec[i].count<<endl; //return 0; //string inputstr; //int a; //int b; //char c[3]; //while(cin>>inputstr>>a>>c) //{ // cout<<inputstr<<a<<c<<'/n'<<endl; //}//"cin>>string/int/char"以空格爲分隔符跳入下一個">>"輸入操做 //cout<<inputstr<<endl; //cout<<a<<endl; //cout<<c<<endl; //cout<<lg.row<<endl; int N,M,tem; cin>>N>>M; int n=N; int m=M; vector<int> score;//保存分數 while(n--)//輸入分數並保存操做,不清除輸入緩衝區,保證輸入的一列被錄入 { cin>>tem; score.push_back(tem); } char mode; int A,B; vector<int> answer(M);//想對vector直接賦值就得定義大小,若是不定義大小,直接賦值會出錯,只能用push_back int i=0;//答案下標 while(m--) { cin.sync();//清空cin輸入緩衝區,1.保證輸入的是當前輸入行的數據;2. 保證每次輸入的是一行中的數據 cin>>mode>>A>>B; if(mode=='Q') answer[i++]=getmax(score,A,B); else score[A-1]=B;//將第A個ID改成B } for(int j=0;j<i;j++) cout<<answer[j]<<endl; } //樣例輸入: //5 6 //1 2 3 4 5 //Q 1 5 //U 3 6 //Q 3 4 //Q 4 5 //U 2 9 //Q 1 5
題2c++
#include <iostream> #include <string> #include <vector> using namespace std; struct Log { string name; int row; int times; }; string getname(string &addrandname) { string name; int N=addrandname.size(),num=1; while(addrandname[N-num]!='\\'&&num!=17)//跳出循環條件,遇到\或第17次循環 { num++; } name=addrandname.substr(N-num+1,num-1); return name; } void savelog(vector<Log> &vec_log, Log log) { int N=vec_log.size(),flag=0; for(int i=0;i<N;i++) { if(vec_log[i].name==log.name&&vec_log[i].row==log.row) { vec_log[i].times++; flag=1; } } if(flag==0) { vec_log.push_back(log); } } void prin(vector<Log> vec_log) { int N=vec_log.size(); for(int i=0;i<N;i++) { cout<<vec_log[i].name<<" "<<vec_log[i].row<<" "<<vec_log[i].times<<endl; } } int main() { string addrandname; int row; cin.sync();//清除輸入緩衝區中的數據流 cin.clear();// 將流中的全部狀態值都重設爲有效值 vector<Log> vec_log; Log log; while(cin>>addrandname>>row) { log.name=getname(addrandname); log.row=row; log.times=1; savelog(vec_log,log); prin(vec_log); cin.sync(); cin.clear(); } //string name,aa="123456789123456789.c"; //name=getname(aa); //cout<<name<<endl; //addrandname="aaaa"; //addrandname="fie"; //cout<<addrandname<<endl; }
題3數組
#include<iostream> #include<string> #include<vector>//vector徹底能夠替代數組,之後數組用vector,字符串用string,char、int、double只用於單個變量 using namespace std; //單張1 對子3 三個5 順子9 四個7 對王11 //首先判斷是否存在一對王 //判斷是否存在四個 //剩下的比較第一張牌大小 //難點:string類的使用,比較,賦值,長度等 //單張牌大小的比較 bool is2joker(string str)//判斷是否爲一對王 { string joker2="joker JOKER",joker21="JOKER joker"; if(str==joker2|str==joker21)//怎麼比較兩個string return true; return false; } bool isquar(string str)//判斷是否爲四個同樣的牌 { if(str.size()==7) if(str[0]==str[6]) return true; return false; } int pai2num(string str_01) { int re; if(str_01=="jo") re=16; else if(str_01=="JO") re=17; else { switch(str_01[0]) { case '3':re=3;break; case '4':re=4;break; case '5':re=5;break; case '6':re=6;break; case '7':re=7;break; case '8':re=8;break; case '9':re=9;break; case '10':re=10;break; case 'j':re=11;break; case 'q':re=12;break; case 'k':re=13;break; case 'a':re=14;break; case 'J':re=11;break; case 'Q':re=12;break; case 'K':re=13;break; case 'A':re=14;break; case '2':re=15;break; default:re=0;break; } } return re; } bool isbig(string str1,string str2)//判斷牌面值的大小 { return pai2num(str1.substr(0,2))>pai2num(str2.substr(0,2))?true:false; } void main() { string str;//這樣的string類型只能由getline(cin,str)全局函數賦值 //char 類型的向量只能由cin.get(str,size)或cin.getline()賦值 string str1; string str2; getline(cin,str);//getline(cin,str,'/n')和cin.getline(char[],size)區別 int loc=0; int loc1=0; int loc2=0; int flag1=0;//是否遇到- cout<<str.size()<<endl; for(loc;loc<str.size();loc++) { //用什麼方法在string後加入字符?以下 //str1+=str[loc];//爲何不能用str1.append(str[loc])或str1.push_back(),由於參數必須爲string類型,而不能是char類型 //cout<<str1<<endl; //string類型的用法? //賦值時用用「」括起來的內容,有+=,append(),insert()方法 //string類型不能用於switch(case 只能用於數值和單個字符‘’的內容比較),通常用if() else if()代替(if和elseif只執行一條,前面的優先級高) if(str[loc]=='-') { flag1=1; loc++; } if(flag1==0) str1+=str[loc]; else str2+=str[loc]; } cout<<"一手牌爲:"<<str1<<endl; cout<<"另外一手牌爲:"<<str2<<endl; if(is2joker(str1)|is2joker(str2))//是否有一對王 { string bigone; bigone=is2joker(str1)?str1:str2; cout<<"最大的手牌爲:"<<bigone<<endl; } else if(isquar(str1)^isquar(str2))//是否其中一手爲四張一樣的牌 { string bigone; bigone=isquar(str1)?str1:str2; cout<<"最大的手牌爲:"<<bigone<<endl; } else if(str1.size()==str2.size())//直接比第一張牌的大小便可 { string bigone; bigone=isbig(str1,str2)?str1:str2; cout<<"最大的手牌爲:"<<bigone<<endl; } else cout<<"ERROR"<<endl; }
筆記:app
1.OJ系統中的題目要求輸入樣例爲一行或多行時,怎麼考慮輸入過程?函數
由於OJ系統的輸入樣例和輸出樣例是一一對應的,每輸入一行樣例就進行處理和輸入n行樣例再進行統一處理不會影響評判結果。在不明確輸入樣例具體爲幾行時,通常用while(getline(cin,str)){}或者while(cin>>str1>>str2){}語句對每一行數據分別進行處理和輸出;當知道輸入樣例的行數時(一個樣例分爲了幾行數據),通常用while(N--){cin>>str1>>str2}語句連續記錄N行輸入數據後再進行處理。spa
2.回顧了vector,string,getline(),cin.getline(),cin.get(),cin>>相關的知識指針
vector:建立vector時若不規定大小(默認爲空),需用push_back()進行」賦值「;建立時若規定了大小,可用[]和=進行指定位置的賦值。vector<>::iterator it; it可看作一個廣義指針,指向容器中的元素;而vector<>* p2v;是指向容器的指針,p2v->el。code
string:徹底能夠代替字符數組char ch[]。一種特殊的字符容器(比單純的字符容器更強大),可看做普通數據類型,能進行+(拼接)、=(賦值)、==(判斷是否相等)等操做,通常用cin>>str和getline(cin,str)方式賦值。注:cin>>可對string和char數組進行賦值;getline()只用於對string賦值;cin.get()和cin.getline()只用於對char數組進行賦值。htm
getline()與cin.getline()不一樣之處在於,前者能夠規定文件結束符(默認爲‘\n’),且它們是不一樣的概念,前者屬於istream,後者屬於cin流。注意:getline()在vc6下須要多打一個回車才能肯定賦值(第一個回車是結束符,第二回車是輸入結束標誌?),而在vs下只需一個回車符。
cin.get():雖然可用於得到字符串,但通常用於取一個字符(任何字符)。
cin>>:以‘ ’爲分隔符,‘\n’爲結束符。一次>>到分隔符爲至,剩餘字符保存在緩衝區中,可用於下一個>>操做。爲了不誤操做,通常用cin.clear()和cin.sync()恢復cin狀態和清空緩衝區。