美团 笔试 10.17 后端 AK

  • 不知道是不是因为最后一次笔试,不太想要人了,感觉过于简单..

第一题 第i个盒子里有a[i]个b[i]的盒子 小模拟

#include <bits/stdc++.h>

using namespace std;
int const maxn = 1e5 + 10;
int const MOD = 1e9 + 7;
typedef long long ll;


ll ans[maxn];
ll a[maxn], b[maxn];
int n;
int main(void) {
    cin >> n;
    ans[1] = 1;
    for (int i = 2; i <= n; i++) {
        cin >> a[i];
    }

    for (int i = 2; i <= n; i++) {
        cin >> b[i];
    }

    for (int i = 2; i <= n; i++) {
        ans[i] = (a[i] * ans[b[i]]) % MOD;
    }
    for (int i = 1; i <= n; i++) {
        cout << ans[i] << " ";
    }

    return 0;
}

第二题 字典序前100的全排列 dfs

#include <bits/stdc++.h>

using namespace std;
int const maxn = 1e5 + 10;
int const MOD = 1e9 + 7;
typedef long long ll;

vector<vector<int>> ans;
vector<int> v;
int vis[maxn];
int n;

void dfs(int step) {
    if (step >= n + 1) {
        ans.emplace_back(v);
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            int pos = v.size() + 1;
            if (pos == i) continue;
            v.emplace_back(i);
            vis[i] = 1;
            dfs(step + 1);
            v.pop_back();
            vis[i] = 0;
        }
    }
}

int main(void) {
    cin >> n;

    dfs(1);

    cout << ans.size() << endl;
    sort(ans.begin(), ans.end());
    for (int i = 0; i < min((int)ans.size(), 100); i++) {
        for (auto &x : ans[i]) {
            cout << x << " ";
        }
        cout << endl;
    }

    return 0;
}

第三题 判断树 裸并查集 输入有点恶心

#include <bits/stdc++.h>

using namespace std;
int const maxn = 1e5 + 10;
int const MOD = 1e9 + 7;
typedef long long ll;

int fa[maxn];
int n, m;

void init(int n) {
    for (int i = 1; i <= n; i++) {
        fa[i] = i;
    }
}

int find(int x) {
    if (x == fa[x]) {
        return x;
    }
    return fa[x] = find(fa[x]);
}

bool merge(int x, int y) {
    int fx = find(x);
    int fy = find(y);
    if (fx != fy) {
        fa[fx] = fy;
        return false;
    }
    return true;
}

void mergeEdge(string &s) {
    vector<int> v;
    int tmp = 0;
    for (auto &x : s) {
        if (x == ']' || x == ',') {
            v.emplace_back(tmp);
            tmp = 0;
            continue;
        }
        if (x >= '0' && x <= '9') {
            tmp = tmp * 10 + (x - '0');
        }
    }
    for (int i = 0; i < v.size(); i += 2) {
        int x = v[i], y = v[i + 1];
        merge(x, y);
    }
}

int main(void) {
    int t;
    cin >> t;
    while (t--) {
        cin >> n >> m;
        getchar();

        int flag = 0;
        if (n - 1 != m) {
            flag = 1;
        }
        string edgestr;
        getline(cin, edgestr);
        init(n);
        mergeEdge(edgestr);
        int dx = 0;
        for (int i = 1; i <= n; i++) {
            if (find(i) == i) {
                dx++;
                if (dx > 1) {
                    flag = 1;
                    break;
                }
            }
        }
        if (flag) {
            cout << "No" << endl;
        } else {
            cout << "Yes" << endl;
        }
    }

    return 0;
}

第四题 a^x MOD m = y 最小的x

其实,不太会,然后想着拿快速幂去暴力下,骗一个分,结果居然过了,可能数据水了...

#include <bits/stdc++.h>

using namespace std;
int const maxn = 1e5 + 10;
int const MOD = 1e9 + 7;
typedef long long ll;

ll pow_mod(ll a, ll x, const ll &mod) {
    if (x == 0) return 1;
    ll ans = pow_mod(a, x >> 1, mod);
    ans = ans * ans % mod;
    if (x & 1 == 1) 
        ans = ans * a % mod;
    return ans;
}

int main(void) {
    int t;
    cin >> t;
    while (t--) {
        ll a, m, y;
        cin >> a >> m >> y;
        int ans = -1;
        for (int i = 0; i <= 100000; i++) {
            ll ret = pow_mod(a, i, m);
            if(ret == y) {
                ans = i;
                break;
            }
        }
        cout << ans << endl;
    }   

    return 0;
}

第五题 双端队列模拟 注意m的范围 对n离散化

#include <bits/stdc++.h>

using namespace std;
int const maxn = 1e5 + 10;
int const MOD = 1e9 + 7;
typedef long long ll;

struct node {
    int opt, id, sid;
};

int main(void) {
    int n, m;
    cin >> n >> m;
    vector<int> v;
    vector<node> opts;
    for (int i = 0; i < m; i++) {
        int opt, id, sid;
        cin >> opt;
        if (opt == 1) {
            cin >> id >> sid;
            v.push_back(id);
            opts.push_back({opt, id, sid});
        } else {
            cin >> id;
            v.push_back(id);
            opts.push_back({opt, id, -1});
        }
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    n = v.size();
    vector<deque<int>> qs(n + 1);
    for (int i = 0; i < m; i++) {
        node o = opts[i];
        int opt = opts[i].opt, id = opts[i].id, sid = opts[i].sid;
        id = lower_bound(v.begin(), v.end(), id) - v.begin() + 1;
        if (opt == 1) {
            qs[id].push_back(sid);
        } else {
            if (qs[id].size() == 0) {
                cout << -1 << endl;
            } else {
                int ret = qs[id].front();
                qs[id].pop_front();
                cout << ret << endl;
            }
        }
    }


    return 0;
}
#笔试##美团##笔经#
全部评论
面试邀请出了么?
点赞 回复 分享
发布于 2021-10-25 02:16
美团太狠了,5道编程题
点赞 回复 分享
发布于 2021-10-19 17:25
我记得还有几道选择题,我选的是算法方向
点赞 回复 分享
发布于 2021-10-25 02:16

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
5
5
分享
牛客网
牛客企业服务