美团26暑期实习笔试

📍公司:美团26暑期实习

👜岗位:后端开发

📖问题:

一共三道编程题,两道水题,一道高级数据结构题。

字符串模拟

  • 题目简介:初始一个空字符串。给一组操作,如果操作是数字就记录下来更新变量g(g初始为0)。否则先将字符串循环右移g位再判断操作,如果该操作是'R',翻转字符串否则将该操作对应的字符加到字符串后面。
  • 代码
#include <bits/stdc++.h>

using namespace std;
int main() {
    int T;
    cin >> T;
    while (T--) {
        string s, res = "";
        int g = 0;
        cin >> s;
        for (char op : s) {
            if (isdigit(op)) {
                g = g * 10 + (op - '0');
                continue;
            }
            if (res.size()) g %= res.size();
            res = res.substr(g) + res.substr(0, g);
            if (op == 'R') reverse(res.begin(), res.end());
            else res += op;
        }
        cout << res << endl;
    }
    return 0;
}

炮能打到的敌人数

  • 题目简介:在一个无限大的2D棋盘上有n个炮。每个炮有个坐标(x,y)。该炮的正上方如果有超过两个棋子,则他可以打该方向。正下方,正左边,正右边同理。问这n个炮每个能打到几个方向。
  • 代码
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

struct node {
    int x, y, id;
}g[N];

int cnt[N];

bool cmp_x(node a, node b) {
    if (a.x == b.x) return a.y < b.y;
    return a.x < b.x;
}

bool cmp_y(node a, node b) {
    if (a.y == b.y) return a.x < b.x;
    return a.y < b.y;
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> g[i].x >> g[i].y;
        g[i].id = i;
    }

    sort(g + 1, g + n + 1, cmp_x);
    for (int i = 1; i <= n; ++i) {
        int L = i - 2, R = i + 2, idx = g[i].id;
        cnt[idx] += (L >= 1 && g[L].x == g[i].x);
        cnt[idx] += (R <= n && g[R].x == g[i].x);
    }

    sort(g + 1, g + n + 1, cmp_y);
    for (int i = 1; i <= n; ++i) {
        int L = i - 2, R = i + 2, idx = g[i].id;
        cnt[idx] += (L >= 1 && g[L].y == g[i].y);
        cnt[idx] += (R <= n && g[R].y == g[i].y);
    }

    for (int i = 1; i <= n; ++i) {
        cout << cnt[i] << endl;
    }
    
    return 0;
}

找BUG

  • 题目简介:有一颗树,树上每个节点对应一个字母,问给定的u->v的简单路径上有没有"BUG"这个子序列。有输出"NO",没有输出"YES"。
  • 代码(树链剖分,暴力O(n^2)是0分)
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 10;

int h[N], e[N], ne[N], idx;
int n, q, siz[N], dep[N], fa[N], son[N], top[N], id[N], rid[N], cnt;
vector<int> nw[N][3];
char s[N];
string bug = "BUG";
unordered_map<char, int> ump = {
    {'B', 0}, {'U', 1}, {'G', 2}
};

void add(int u, int v) {
    e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}

void init_dfs(int u, int f) {
    siz[u] = 1;
    fa[u] = f;
    for (int i = h[u]; ~i; i = ne[i]) {
        int v = e[i];
        if (v == f) continue;
        dep[v] = dep[u] + 1; 
        init_dfs(v, u);
        siz[u] += siz[v];
        if (siz[v] > siz[son[u]]) son[u] = v;
    }
}

void dfs(int u, int t) {
    id[u] = ++cnt; rid[cnt] = u; top[u] = t; nw[t][ump[s[u]]].push_back(cnt);
    if (!son[u]) return;
    dfs(son[u], t);
    for (int i = h[u]; ~i; i = ne[i]) {
        int v = e[i];
        if (v == fa[u] || v == son[u]) continue;
        dfs(v, v);
    }
}

int find(int x, vector<int> &a) {
    int l = 0, r = a.size() - 1, res = -1;
    while (l <= r) {
        int mid = l + r >> 1;
        if (a[mid] <= x) res = mid, l = mid + 1;
        else r = mid - 1;
    }
    return res;
}

string query(int u, int v) {
    int ch = 0, ct = 2; // head and tail (head u->v tail v->u)
    while (top[u] != top[v]) {
        if (dep[top[u]] >= dep[top[v]]) { // find u->v
            int tu = top[u];
            int f = find(id[u], nw[tu][ch]);
            if (~f) u = rid[nw[tu][ch++][f]]; 
            else u = fa[top[u]];
        }
        else { // find v->u
            int tv = top[v];
            int f = find(id[v], nw[tv][ct]);
            if (~f) v = rid[nw[tv][ct--][f]]; 
            else v = fa[top[v]];
        }
        if (ch > ct) return "NO";
    }
    
    while (u != v) {
        if (dep[u] >= dep[v]) {
            int tu = top[u];
            int f = find(id[u], nw[tu][ch]);
            if (~f) {
                u = rid[nw[tu][ch++][f]];
                if (u < v) break;
            }
            else break;
        }
        else {
            int tv = top[v];
            int f = find(id[v], nw[tv][ct]);
            if (~f) {
                v = rid[nw[tv][ct--][f]];
                if (v < u) break;
            }
            else break;
        }
        if (ch > ct) return "NO";
    }
    if (u == v && ch == ct && s[u] == bug[ch]) return "NO";
    return "YES";
}

int main() {
    cin >> n >> q;
    memset(h, -1, sizeof h);
    cin >> s + 1;
    for (int i = 1; i <= n; i++) {
       int f;
       cin >> f;
       add(f, i); add(i, f); 
    }

    init_dfs(1, 0);
    dfs(1, 1);

    while (q--) {
        int u, v;
        cin >> u >> v;
        cout << query(u, v) << endl;
    }
    return 0;
}
/*
14 4
UBGBUBGGBUGBGU
0 1 1 2 2 4 4 5 3 9 9 10 10 10
6 3
11 14
11 4
11 7
*/

以上代码均为参考代码。最后一题我赛时没掏上,后面口胡补的。

#软件开发笔面经#
全部评论
佬,美团后端笔试没有选择题吗,就3道算法题吗?
点赞 回复 分享
发布于 03-22 14:50 湖北
选的java岗,算法可以用c++吗
点赞 回复 分享
发布于 03-21 16:18 四川
是3.8的笔试吗?
点赞 回复 分享
发布于 03-14 21:45 上海

相关推荐

平台碎片化带来的适配困境是客户端开发者面临的首要挑战。Android生态的碎片化问题尤为严重,全球上万种不同机型在屏幕尺寸、硬件性能和系统定制化方面存在巨大差异。开发者不得不耗费大量时间处理各种兼容性问题,从低端机的性能优化到厂商ROM的特殊行为适配,再到不同系统版本的API兼容。这种碎片化不仅存在于Android平台,iOS开发者同样需要应对苹果严格的审核政策和频繁的系统更新。相比之下,后端开发者面对的是相对标准化的服务器环境,而客户端开发者却要将30%以上的开发时间浪费在兼容性调试这种低技术含量却又必不可少的工作上。技术迭代与业务实际需求之间的脱节让开发者陷入两难境地。苹果和Google每年都会推出大量新技术和新框架,但这些更新在实际业务落地时往往遇到阻碍。企业出于稳定性和成本考虑,通常会选择保守的技术路线,导致开发者被迫同时维护新旧两套代码。更令人困扰的是,一些被官方力推的新技术如SwiftUI和Jetpack&nbsp;Compose,在成熟度和性能上还无法完全替代传统方案。这种既要学习新技术又要维护旧代码的状态,不仅增加了工作负担,也让很多开发者感到职业发展的迷茫。性能优化的边际效益递减现象严重影响了开发者的工作成就感。客户端性能优化看似技术含量很高,但实际上投入产出比往往不尽如人意。将App启动时间从1.2秒优化到0.8秒可能需要数周的努力,但普通用户可能根本察觉不到这种差异。相比之下,后端团队的性能优化成果通常能直接反映在业务指标上。更令人沮丧的是,客户端优化的方法论已经高度标准化,很难体现开发者的技术独特性。此外,平台方的各种限制政策也让优化工作变得束手束脚,开发者不得不把大量精力花在应付平台规则而非真正的技术创新上。繁琐的发布流程严重制约了开发效率和创新尝试。客户端应用的更新必须经过应用商店审核,这个过程不仅耗时(iOS审核通常需要1-3天),还存在被拒风险。紧急热修复受到严格限制,使得线上问题的响应速度远低于Web应用。Android平台还面临着用户不愿升级的困境,开发者不得不长期维护多个历史版本。这种冗长的发布周期使得A/B测试和快速迭代变得异常困难,在强调敏捷开发的今天,这种滞后性严重制约了产品创新和用户体验的提升。#我的求职思考# #软件开发投递记录# #如果再来一次,你还会选择这个工作吗?# #当你面对裁员会如何?# #客户端春招# #工作中,努力重要还是选择重要?# #第一份工作应该选择高薪还是大平台# #当你面对裁员会如何?# #我想象的工作vs实际工作# #工作丧失热情的瞬间#
点赞 评论 收藏
分享
全程50min左右1.&nbsp;&nbsp;&nbsp;&nbsp;自我介绍。2.&nbsp;&nbsp;&nbsp;&nbsp;项目与所投递部门的场景类似,直接上来问项目,一点八股没问&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a)&nbsp;&nbsp;&nbsp;&nbsp;整体项目的架构&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b)&nbsp;&nbsp;&nbsp;&nbsp;订单的状态机是怎么设计的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c)&nbsp;&nbsp;&nbsp;&nbsp;司机抢单的实现方法?在redis中为司机创建临时队列,当司机和乘客数量很多事&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d)&nbsp;&nbsp;&nbsp;&nbsp;订单支付使用异步支付,如何确保用户不会重复支付订单?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e)&nbsp;&nbsp;&nbsp;&nbsp;比如乘客与司机都有一个表,在对两者的订单数据进行持久化时,如何解决乘客的订单写入了数据库,但此时司机的订单未写入数据库的问题?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f)&nbsp;&nbsp;&nbsp;&nbsp;如何解决类似服务时延比较高的问题?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g)&nbsp;&nbsp;&nbsp;&nbsp;还有若干针对项目的拷打,给我问懵了,说是“拷打”,但是面试官其实态度非常和蔼。3.&nbsp;&nbsp;&nbsp;&nbsp;因为这两天全在看八股,完全忘了把项目梳理一遍,细节基本上都忘了,觉得自己在靠本能去回答,感觉答得非常不好。4.&nbsp;&nbsp;&nbsp;&nbsp;手撕代码:lc767重构字符串,一开始比较懵,然后想到了每次选择当前数量最多的字母加入字符串的方法,但是写的时候忘记更新数组了(我是用的数组维护每种字符数量,没用大根堆),好像面试官没注意到。5.&nbsp;&nbsp;&nbsp;&nbsp;面试官的建议:需要加深基础,数据库、redis、消息队列这方面(大概是这个意思)6.&nbsp;&nbsp;&nbsp;&nbsp;最后就是一些常规的问题类似“对于我们部门的业务,你有什么想要了解的”,“还有在面其他公司吗?”这种问题。7.&nbsp;&nbsp;&nbsp;&nbsp;作为自己的处女面,体验还挺不错的,但是我太菜了……,项目没准备好,而且看过的一些场景下的解决策略也全不记得了……,还是基础太差了……
查看9道真题和解析
点赞 评论 收藏
分享
评论
8
18
分享

创作者周榜

更多
牛客网
牛客企业服务