华为4.15软件类笔试
题目难度不算大,不过前两题涉及字符串处理,C++写起来还是挺繁琐的,贴一下代码,3道题都AC了
第一题
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
struct Info {
string name;
int cnt;
};
vector<Info> vec;
map<string, int> mp;
bool check(string s) {
if (s.size() == 0)
return false;
int len = s.size();
if (s[0] < 'A' || s[0] > 'Z')
return false;
for (int i = 1; i < len; ++i)
if (s[i] < 'a' || s[i] > 'z')
return false;
++mp[s];
return true;
}
bool split(string s) {
int len = s.size();
if (len == 0)
return false;
string cur;
int p = 0;
while (p < len) {
if (s[p] == ',') {
bool ok = check(cur);
if (!ok)
return false;
cur = "";
} else {
cur += s[p];
}
++p;
}
if (cur.size() > 0) {
bool ok = check(cur);
if (!ok)
return false;
}
return true;
}
bool cmp(const Info &a, const Info &b) {
if (a.cnt != b.cnt)
return a.cnt < b.cnt;
if (a.name.size() == b.name.size())
return a.name > b.name;
if (a.name.find(b.name) != string::npos) {
return true;
}
if (b.name.find(a.name) != string::npos)
return false;
return a.name > b.name;
}
int main()
{
string input;
cin >> input;
bool valid = split(input);
if (!valid) {
cout << "error.0001" << endl;
} else {
for (auto o : mp) {
vec.push_back({o.first, o.second});
}
sort(vec.begin(), vec.end(), cmp);
cout << vec[vec.size() - 1].name << endl;
}
return 0;
} 第二题#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Info {
string addr;
string mask;
string val;
};
vector<Info> vec;
string pattern, content;
bool check16(string s) {
int len = s.size();
if (len < 3)
return false;
int idx = 0;
if (s[idx] != '0')
return false;
++idx;
if (s[idx] != 'x' && s[idx] != 'X')
return false;
++idx;
string num = s.substr(idx);
for (int i = 0; i < num.size(); ++i) {
char ch = num[i];
if (ch >= '0' && ch <= '9')
continue;
if (ch >= 'A' && ch <= 'F')
continue;
if (ch >= 'a' && ch <= 'f')
continue;
return false;
}
return true;
}
void check(string s) {
int len = s.size();
string head = s.substr(0, pattern.size());
if (head != pattern)
return;
int idx = pattern.size();
if (idx < len && s[idx] != '[')
return;
++idx;
if (s.substr(idx, 5) != "addr=")
return;
idx += 5;
int comma = s.find(",", idx);
if (comma == string::npos || !check16(s.substr(idx, comma - idx)))
return;
string addr = s.substr(idx, comma - idx);
// cout << addr << endl;
idx = comma + 1;
if (s.substr(idx, 5) != "mask=")
return;
idx += 5;
// cout << idx << endl;
comma = s.find(",", idx);
// cout << comma << endl;
if (comma == string::npos || !check16(s.substr(idx, comma - idx)))
return;
string mask = s.substr(idx, comma - idx);
// cout << mask << endl;
idx = comma + 1;
if (s.substr(idx, 4) != "val=")
return;
idx += 4;
if (!check16(s.substr(idx)))
return;
string val = s.substr(idx);
// cout << val << endl;
vec.push_back({addr, mask, val});
}
void solve(string s) {
int len = s.size();
int idx = 0;
while (idx < len) {
int r = s.find("],", idx);
if (r == string::npos)
break;
check(s.substr(idx, r - idx));
idx = r + 2;
}
while (idx < len) {
int r = s.find("]", idx);
// cout << r << endl;
if (r == string::npos)
break;
check(s.substr(idx, r - idx));
idx = r + 1;
}
}
int main()
{
cin >> pattern >> content;
solve(content);
if (vec.size() == 0)
cout << "FAIL" << endl;
else {
for (int i = 0; i < vec.size(); ++i)
cout << vec[i].addr << " " << vec[i].mask << " " << vec[i].val << "\r\n";
}
return 0;
} 第三题#include <stdio.h>
#include <map>
#include <iostream>
#include <string.h>
#include <string>
#include <vector>
using namespace std;
vector<int> callnum, fsize;
vector<vector<int>> G;
int ans;
map<string, int> mp;
vector<bool> vis;
bool dfs(int cur, int sum) {
vis[cur] = true;
ans = max(ans, sum);
for (int i = 0; i < G[cur].size(); ++i) {
int nxt = G[cur][i];
if (vis[nxt])
return false;
bool ret = dfs(nxt, sum + fsize[nxt]);
if (!ret)
return false;
}
vis[cur] = false;
return true;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int num;
cin >> num;
callnum.push_back(num);
}
int id = 0;
for (int i = 0; i < n; ++i) {
string name;
cin >> name;
if (mp.count(name) == 0) {
mp[name] = ++id;
}
int sz;
cin >> sz;
fsize.resize(id + 5);
fsize[mp[name]] = sz;
// cout << sz << endl;
for (int j = 0; j < callnum[i]; ++j) {
// cout << j << endl;
string s;
cin >> s;
if (mp.count(s) == 0)
mp[s] = ++id;
G.resize(id + 5);
G[mp[name]].push_back(mp[s]);
}
}
// cout << id << endl;
if (id != n) {
cout << "NA" << endl;
return 0;
}
vis.resize(id + 5);
for (auto o : mp) {
int enter = o.second;
for (int i = 1; i <= id; ++i)
vis[i] = false;
bool ret = dfs(enter, fsize[enter]);
if (!ret) {
cout << "R" << endl;
return 0;
}
}
cout << ans << endl;
return 0;
} 
