华为笔试2.7 4-15
这次笔试感觉有点难度,主要是华为的一些边界规则有点难顶。
第一题,普通排序题,AC。(不记得map的sort,放到vector里面有点难写。)
#include <algorithm> #include<iostream> #include<string> #include<map> #include<vector> using namespace std; int main() { string s; cin>>s; map<string,int> mp; int i=0,size=s.size(),j; string cur; while(i<size) { j=i;cur=""; if(s[i]<'A'||s[i]>'Z') {cout<<"error.0001"<<endl;return 0;} while(j<size&&s[j]!=',') { cur+=s[j];j++; } mp[cur]++; for(int i=1;i<cur.size();i++) if(cur[i]<'a'||cur[i]>'z') {cout<<"error.0001"<<endl;return 0;} i=j+1; } vector<vector<int>> v;map<int,int> mp2;map<int,string> mp3; int k=1; for(auto p=mp.begin();p!=mp.end();p++) { mp2[k]=p->second; mp3[k]=p->first; v.push_back({p->second,k}); k++; } sort(v.begin(),v.end(),[&](vector<int> a,vector<int> b) { if(a[0]==b[0]) return a[1]<b[1]; return a[0]>b[0]; }); string res;int m=v[0][0];string c=mp3[v[0][1]]; for(int i=0;i<v.size();i++) { if(v[i][0]<m) break; if(c>mp3[v[i][1]]) c=mp3[v[i][1]]; } cout<<c<<endl; system("pause"); return 0; }
第二题,字符串匹配,c++没有字符串分割函数写起来真的有点操蛋,几个规则要读懂,但是最后总算AC了。代码相当丑陋。
#include<iostream> #include<string> #include<map> #include <vector> #include<stdio.h> using namespace std; int main() { string q,s; cin>>q;cin>>s; map<string,int> mp; mp[q]=1;mp["addr"]=1;mp["mask"]=1;mp["val"]=1; int i=0,j=0,size=s.size(); string res,cur;vector<vector<string>> Res; int flag=1; while(i<size) { j=i;cur="";flag=1; vector<string> v; while(j<size&&s[j]!='[') {cur+=s[j];j++;} if(mp[cur]==0) flag=0; j++;int k=j; while(flag==1) { cur=""; while(k<size&&s[k]!='=') {cur+=s[k],k++;} k++; if(cur!="addr") {flag=1;break;} cur=""; while(k<size&&s[k]!=',') {cur+=s[k];k++;} k++; v.push_back(cur); if(cur[0]=='0'&&(cur[1]!='x'||cur[1]!='X')) {;} else{flag=1;break;} cur=""; while(k<size&&s[k]!='=') {cur+=s[k],k++;} k++; if(cur!="mask") {flag=1;break;} cur=""; while(k<size&&s[k]!=',') {cur+=s[k];k++;} k++; v.push_back(cur); if(cur[0]=='0'&&(cur[1]!='x'||cur[1]!='X')) {;} else{flag=1;break;} cur=""; while(k<size&&s[k]!='=') {cur+=s[k],k++;} k++; if(cur!="val") {flag=1,j=k;break;} cur=""; while(k<size&&s[k]!=']') {cur+=s[k];k++;} k++; k++; v.push_back(cur); if(cur[0]=='0'&&(cur[1]!='x'||cur[1]!='X')) {;} else{flag=1;break;} flag=-1; } if(flag==1) { while(s[j]!=']') j++; j++; } if(flag==0) { while(j<size&&s[j]!=']') j++; j++;j++; } if(flag==-1) { Res.push_back(v); for(i=0;i<v.size()-1;i++) cout<<v[i]<<" "; cout<<v[i]<<"\r"<<endl; j=k; } i=j; } if(Res.size()==0) cout<<"FAIL"<<endl; system("pause"); return 0; }
第三题,一个树到顶到叶子结点的距离,DFS,输入不知道说这个结点没有栈空间,不知道位置是有数字还是没有数字。最后70%难顶。
#include<iostream> #include<vector> #include<map> using namespace std; int R=0,NA=0; int max_le=0; map<int,vector<int>> mp; map<int,int> mp1;int n; void dfs(int k,vector<int> &vis,int le) { if(mp[k].size()==0) max_le=max(max_le,le); int a,b; for(int i=0;i<mp[k].size();i++) { a=mp[k][i];b=mp1[a]; if(b<=n) {NA=1;return;} if(vis[a]==1) { R=1; return ; } vis[a]=1; dfs(a,vis,le+b); if(R==1) return ; vis[a]=0; } } int main() { cin>>n;int m=0; vector<int> vis(n,0); vector<int> v(n,0); for(int i=0;i<n;i++) cin>>v[i]; int a,b; while(m<n) { cin>>a>>b; mp1[a]=b; for(int i=0;i<v[m];i++) { cin>>b;mp[a].push_back(b); } m++; } for(int i=1;i<=n;i++) { vis[i]=1; dfs(i,vis,mp1[i]); if(R==1) break; vis[i]=0; } if(R==1) cout<<"R"<<endl; else { if(NA==1) {cout<<"NA"<<endl;return 0;} cout<<max_le<<endl; } system("pause"); return 0; }