华为笔试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;
}



查看10道真题和解析