笔试总共2小时,三道题,时间挺充裕的,但是最后只做了一道,原因在于自己很浮躁,不审题,不仔细思考。没过的两道都是稍微改一下代码就能过,但是没过就是没过,要引以为戒
题目1:
但是有一天小W发现钟表似乎坏了,显示了一个不可能存在的时间“98:23:00”,小W希望改变最少的数字,使得电子时钟显示的时间为一个真实存在的时间,譬如“98:23:00”通过修改第一个’9’为’1’,即可成为一个真实存在的时间“18:23:00”。修改的方法可能有很多,小W想知道,在满足改变最少的数字的前提下,符合条件的字典序最小的时间是多少。其中字典序比较为用“HHMMSS”的6位字符串进行比较。
思路:一开始觉得这个题很麻烦,后面觉得想了一下只有4位要判断的,就是时位上的两个和分位上的第一个以及秒位上的第一个,剩下怎么样都不会不合法
首先第一位,只能是0~2,如果出错,那么就改成0,因为要字典序最小
然后第二位,这里我栽了跟头,也是我这道题没过的原因,就是如果第一位上不是2的话,那么第二位0~9都合法,然而是第一位2的话,第二位就只能是0~3,关键来了,如果第二位不合法,要把第二位变成0吗?因为第一位是这样做的,所以会想当然的这样想,然而这样是错的,第二位不合法可以通过修改第一位使第二位合法,将第一位修改为0的话字典序更小
后面的两位,如果大于5则改成0
#include <iostream> #include <string> using namespace std ; int main(){ int n ; cin >> n ; while(n--){ string time ; cin >> time ; for(int i=0;i<time.length();i++){ int num = time[i] - '0' ; if(i==0&&num>2){ time[i] = '0' ; } if(i==1){ if(time[0]=='2'&&num>3){ time[0] = '0' ; } } if(i==3&&num>5){ time[i] = '0' ; } if(i==6&&num>5){ time[i] = '0' ; } } cout << time << endl ; } }
第二题:
小云正在参与开发一个即时聊天工具,他负责其中的会话列表部分。
会话列表为显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正整数id表示。
当用户在一个会话中发送或接收信息时,如果该会话已经在会话列表中,则会从原来的位置移到列表的最上方;如果没有在会话列表中,则在会话列表最上方插入该会话。
小云在现在要做的工作是测试,他会先把会话列表清空等待接收信息。当接收完大量来自不同会话的信息后,就输出当前的会话列表,以检查其中是否有bug。
#include <iostream> #include <vector> using namespace std ; int main(){ vector<long> list ; int n, m, id ; long reIdx ; cin >> n ; while(n--){ cin >> m ; list.clear() ; for(int i=0;i<m;i++){ cin >> id ; if(list.empty()){ list.push_back(id) ; }else{ reIdx = -1 ; for(int j=0;j<list.size();j++){ if(list[j]==id){ reIdx = j ; } } if(reIdx==-1){ list.push_back(id) ; reIdx = list.size()-1; } for(int k=reIdx;k>=1;k--){ int temp = list[k] ; list[k] = list[k-1] ; list[k-1] = temp ; } } } for(int i=0;i<list.size()-1;i++){ cout << list[i] << " " ; } cout << list[list.size()-1] << endl ; } }
思路:这题过了,题也不难,唯一值得注意的就是我使用vector操作的,将队尾的元素塞进队首我是一个一个交换上去的,但是发现答案里有在塞id的时候判断有没有重复,如果有就删了加到队尾,最后利用reverse方法翻转vector,比我的好多了
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n,m,id; vector<vector<int>> res; cin >> n; for(int i = 0;i < n;i++) { vector<int> per; vector<int>::iterator it; cin >> m; //输入ID号码 for(int j = 0;j < m;j++) { cin >> id; it = find(per.begin(),per.end(),id); if(it != per.end()) { per.erase(it); } per.push_back(id); } reverse(per.begin(),per.end()); res.push_back(per); } for(int i = 0;i < res.size();i++) { for(int j = 0;j < res[i].size();j++) { if(j == res[i].size() - 1) cout << res[i][j] <<endl; else cout << res[i][j] << " "; } } return 0; }
第三题:
#include <iostream> #include <vector> #include <string> using namespace std ; void findWord(vector<vector<char>> mtr,int x,int y,string target,int &cnt){ if(target[0]!=mtr[x][y]) return ; int R , D ,RD ; R = 1 ; D = 1 ; RD = 1 ; for(int i=1;i<target.length();i++){ if((x+i)>=mtr.size()||mtr[x+i][y]!=target[i]){ D = 0; } if((y+i)>=mtr[0].size()||mtr[x][y+i]!=target[i]){ R = 0 ; } if((x+i)>=mtr.size()||(y+i)>=mtr[0].size()||mtr[x+i][y+i]!=target[i]){ RD = 0 ; } } cnt = cnt + R + D + RD ; } int main(){ int t , n , m , ans; string row ; string target ; cin >> t ; while(t--){ cin >> m >> n ; vector<vector<char>> mtr(m,vector<char>(n)) ; ans = 0 ; for(int i=0;i<m;i++){ cin >> row ; for(int j=0;j<n;j++){ mtr[i][j] = row[j] ; } } cin >> target ; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ findWord(mtr,i,j,target,ans) ; } } cout << ans << endl ; } }
初始化2维vector
vector<vector<char>> mtr(m,vector<char>(n)) ;