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


#华为笔试##华为##笔试题目#
全部评论
老哥,你是投的是无线部门的软件实习嘛?为什么我还没有消息通知面试。。。。
点赞 回复
分享
发布于 2020-04-16 09:55
点赞 回复
分享
发布于 2020-04-19 17:48
秋招专场
校招火热招聘中
官网直投
老哥,我明天笔试
点赞 回复
分享
发布于 2020-04-21 23:00
请问楼主有原题可以看嘛,谢谢了
点赞 回复
分享
发布于 2020-04-22 21:10
楼主,请问第三题里面的未给出调用栈大小就输出NA,是指没有给60/80这样的所占用空间大小,直接给调用函数就输出NA吗?但是楼主的好像在没给出占用空间的时候,输出不太对,比如下面两个例子: 5 2 2 1 0 0 1 20 2 3 2 30 3 4  3 50 4 4  5 80 这个输出105 还有 5 2 2 1 0 0 1 20 2 3 2 30 3 4  3 50 4 4 60 5  这个输出160 是我对于“未给出调用栈大小就输出NA”这句话理解错了吗?
点赞 回复
分享
发布于 2020-05-04 18:03

相关推荐

8 22 评论
分享
牛客网
牛客企业服务