【备战春招必看】美团2025届春招第13套笔试解析 | 大厂真题通关指南

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题(建议用时:90分钟/套)
  • 对照解析查漏补缺
  • 配套练习题库

互联网必备刷题宝典🔗

📢 美团技术岗笔试重要信息速览

⏰ 笔试时间安排

  • 常规场次:每周六交替进行
    • 上午场 10:00~11:30
    • 晚间场 19:00~20:30
  • 通知时间:每周四/五通过邮箱发送考试链接

🧩 笔试题型分布

岗位类型 题目构成
算法岗 选择题 + 5道编程
后端开发岗 选择题 + 3道编程
前端/测试岗 选择题 + 2道编程

⚙️ 考试设置要点

  • 考试平台:牛客网(ACM模式)
  • 监考要求
    • 必须开启笔记本前置摄像头
    • 禁止使用手机(需小程序锁定)
    • 允许使用本地IDE
  • 编程规范
    • 严格遵循输入输出格式
    • 注意时间复杂度控制(通常1s对应1e8次运算)

📚 笔试经验贴

(所有展示题面均已进行改编处理,保留核心考点)

本题库收录整理自:

  1. 互联网公开的笔试真题回忆版(经网友投稿)
  2. 各大技术社区公开讨论的经典题型
  3. 历年校招考生提供的解题思路

🔍 题库特点:

  • 100%真实笔试场景还原
  • 包含高频考点题型
  • 提供多语言实现参考
  • 持续更新2024届最新真题

⚠️ 注意事项:

  1. 所有题目均来自公开渠道,已进行改编脱敏处理
  2. 实际笔试可能出现题型变化,请以官方通知为准

🚀 春招备战指南

金三银四求职季即将到来!这里整理了最新美团真题及解析,助你快速掌握笔试套路。建议重点突破以下题型:

  1. 数组/字符串操作
  2. 树形结构应用
  3. 贪心/动态规划
  4. 区间合并问题

(👇 下附最新笔试真题及详细解析 👇)

真题详解(改编版)

题目 1: 点头问题

题目描述

两个人面对面坐着交谈,每当他们觉得对方说的不错时就会点头表示赞同。当两人同时点头时,会导致头部碰撞。小基需要在中间伸手阻止碰撞,问小基一共需要伸手几次。

输入格式

第一行输入一个整数 ()代表对话时长。 接下来两行分别输入长度为 的由 组成的字符串,表示两人在每个时刻是否点头。

输出格式

输出一个整数,表示小基需要伸手的次数。

样例

输入:

4
1001
0101

输出:

1

题解

只需要统计两个字符串相同位置同时为 1 的次数即可。时间复杂度

代码实现

C++:

#include <iostream>
using namespace std;

int main() {
    int len;
    string str1, str2;
    cin >> len >> str1 >> str2;
    
    int cnt = 0;
    for(int i = 0; i < len; i++) {
        if(str1[i] == '1' && str2[i] == '1') {
            cnt++;
        }
    }
    cout << cnt << endl;
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int size = scan.nextInt();
        String seq1 = scan.next();
        String seq2 = scan.next();
        
        int total = 0;
        for(int idx = 0; idx < size; idx++) {
            if(seq1.charAt(idx) == '1' && seq2.charAt(idx) == '1') {
                total++;
            }
        }
        System.out.println(total);
    }
}

Python:

def count_collisions():
    n = int(input())
    seq_1 = input()
    seq_2 = input()
    
    total = sum(1 for i in range(n) if seq_1[i] == '1' and seq_2[i] == '1')
    return total

if __name__ == "__main__":
    print(count_collisions())

题目 2: 染色问题

题目描述

小柯正在对一个长度为 的数组进行染色。初始时所有元素均为无色。每次可以选择以下操作之一:

  1. 选择一个位置染成红色
  2. 选择一个区间 ,如果该区间内红色元素数量多于无色元素,则将整个区间染成红色

求将整个数组染成红色的最少操作次数。

输入格式

第一行输入整数 ()表示测试用例数。 每个测试用例一行,输入一个整数 ()。

输出格式

每个测试用例输出一行,表示最少操作次数。

样例

输入:

3
3
4
12

输出:

3
4
6

题解

对于长度小于等于 2 的数组,操作次数等于数组长度。对于更长的数组,前两次操作会染红两个位置,之后每次操作可以染红 个位置( 为当前红色位置数)。时间复杂度

代码实现

C++:

#include <iostream>
using namespace std;

int main() {
    int test_num;
    cin >> test_num;
    
    while(test_num--) {
        long long arr_len;
        cin >> arr_len;
        
        if(arr_len <= 2) {
            cout << arr_len << endl;
            continue;
        }
        
        long long red = 2, ops = 2;
        while(red < arr_len) {
            red += red - 1;
            ops++;
        }
        cout << ops << endl;
    }
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int testCnt = scan.nextInt();
        
        while(testCnt-- > 0) {
            long arrSize = scan.nextLong();
            
            if(arrSize <= 2) {
                System.out.println(arrSize);
                continue;
            }
            
            long redCnt = 2, opCnt = 2;
            while(redCnt < arrSize) {
                redCnt += redCnt - 1;
                opCnt++;
            }
            System.out.println(opCnt);
        }
    }
}

Python:

def solve_test():
    tests = int(input())
    for _ in range(tests):
        size = int(input())
        if size <= 2:
            print(size)
            continue
            
        red_num, op_num = 2, 2
        while red_num < size:
            red_num += red_num - 1
            op_num += 1
        print(op_num)

if __name__ == "__main__":
    solve_test()

题目 3: 标签分配

题目描述

小兰有 种不同的标签,每种标签只有一个。对于第 个物品,贴上 号标签后美观值为 ,不贴则为 。求所有物品的最大美观值之和。

输入格式

第一行输入两个整数 ()。 第二行输入 个整数 ()。 第三行输入 个整数 ()。 第四行输入 个整数 ()。

输出格式

输出一个整数,表示最大美观值之和。

样例

输入:

3 3
1 2 1
5 4 3
-1 2 -100

输出:

6

题解

使用贪心算法,按标签分类后,每类中选择美观度增量最大的物品贴标签。时间复杂度

代码实现

C++:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int calc_max_beauty(int sz, int tag_cnt, vector<int>& tag_type, 
                   vector<int>& with_tag, vector<int>& no_tag) {
    vector<vector<int>> groups(tag_cnt + 1);
    for(int i = 0; i < sz; i++) {
        groups[tag_type[i]].push_back(i);
    }
    
    int sum = 0;
    for(auto& grp : groups) {
        if(grp.empty()) continue;
        
        sort(grp.begin(), grp.end(), 
             [&](int x, int y) { return no_tag[x] - with_tag[x] < no_tag[y] - with_tag[y]; });
             
        sum += max(with_tag[grp[0]], no_tag[grp[0]]);
        for(int i = 1; i < grp.size(); i++) {
            sum += no_tag[grp[i]];
        }
    }
    return sum;
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(n), c(n);
    
    for(int i = 0; i < n; i++) cin >> a[i];
    for(int i = 0; i < n; i++) cin >> b[i];
    for(int i = 0; i < n; i++) cin >> c[i];
    
    cout << calc_max_beauty(n, m, a, b, c) << endl;
    return 0;
}

题目 4: 地雷引爆

题目描述

小基来到了一个无限大的二维平面上,平面中有 个地雷。第 个地雷的坐标为 ,在 秒时会爆炸,爆炸冲击会引爆与其曼哈顿距离在 以内的所有地雷。求至少需要多长时间才能使至少 个地雷爆炸。

输入格式

第一行输入整数 ()表示测试用例数。 每个测试用例第一行输入两个整数 ()。 接下来 行,每行输入四个整数 ()。 所有 之和不超过

输出格式

每个测试用例输出一行,表示最少等待时间。

样例

输入:

1
3 3
0 0 0 1
1 0 1 1
2 2 3 10

输出:

3

题解

先按爆炸时间排序,用邻接表存储每个地雷能引爆的其他地雷,然后用 DFS 计算连锁反应。时间复杂度

代码实现

C++:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class MineSolver {
private:
    vector<bool> vis;
    vector<vector<int>> adj;
    
    int dfs(int u) {
        if(!vis[u]) return 0;
        vis[u] = false;
        int sum = 1;
        for(int v : adj[u]) sum += dfs(v);
        return sum;
    }

public:
    void solve() {
        int n, m;
        cin >> n >> m;
        vector<vector<long long>> mines(n, vector<long long>(4));
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < 4; j++) {
                cin >> mines[i][j];
            }
        }
        
        sort(mines.begin(), mines.end(), 
             [](const auto& a, const auto& b) { return a[2] < b[2]; });
        
        adj.assign(n, vector<int>());
        vis.assign(n, true);
        
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(abs(mines[i][0] - mines[j][0]) + 
                   abs(mines[i][1] - mines[j][1]) <= mines[i][3]) {
                    adj[i].push_back(j);
                }
            }
        }
        
        int total = 0;
        for(int i = 0; i < n; i++) {
            total += dfs(i);
            if(total >= m) {
                cout << mines[i][2] << '\n';
                break;
            }
        }
    }
};

int main() {
    int t;
    cin >> t;
    MineSolver solver;
    while(t--) solver.solve();
    return 0;
}

Java:

import java.util.*;

public class Main {
    static class MineGame {
        private boolean[] visited;
        private List<Integer>[] graph;
        private int[][] mineData;
        
        private int explode(int pos) {
            if(!visited[pos]) return 0;
            visited[pos] = false;
            int count = 1;
            for(int next : graph[pos]) {
                count += explode(next);
            }
            return count;
        }
        
        public void solve(Scanner in) {
            int size = in.nextInt();
            int target = in.nextInt();
            
            mineData = new int[size][4];
            for(int i = 0; i < size; i++) {
                for(int j = 0; j < 4; j++) {
                    mineData[i][j] = in.nextInt();
                }
            }
            
            Arrays.sort(mineData, (a, b) -> Integer.compare(a[2], b[2]));
            
            graph = new List[size];
            visited = new boolean[size];
            for(int i = 0; i < size; i++) {
                graph[i] = new ArrayList<>();
                visited[i] = true;
            }
            
            for(int i = 0; i < size; i++) {
                for(int j = 0; j < size; j++) {
                    if(Math.abs(mineData[i][0] - mineData[j][0]) + 
                       Math.abs(mineData[i][1] - mineData[j][1]) <= mineData[i][3]) {
                        graph[i].add(j);
                    }
                }
            }
            
            int total = 0;
            for(int i = 0; i < size; i++) {
                total += explode(i);
                if(total >= target) {
                    System.out.println(mineData[i][2]);
                    break;
                }
            }
        }
    }
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int tests = in.nextInt();
        MineGame game = new MineGame();
        while(tests-- > 0) game.solve(in);
    }
}

Python:

class MineField:
    def __init__(self):
        self.vis = []
        self.adj = []
        
    def dfs(self, u):
        if not self.vis[u]:
            return 0
        self.vis[u] = False
        return 1 + sum(self.dfs

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论
有需要大家 可以关注哦~
点赞 回复 分享
发布于 02-24 22:45 浙江
✅ 美团春招备战指南 ✅
点赞 回复 分享
发布于 02-24 22:45 浙江

相关推荐

非堵塞&nbsp;IO、事件循环(Event&nbsp;Loop)和事件队列是现代&nbsp;JavaScript&nbsp;和&nbsp;Node.js&nbsp;应用程序中用于处理异步操作的核心概念。它们共同工作,使得在单线程环境下能够高效地处理输入/输出操作。以下是这些概念的详细解释:https://www.nowcoder.com/issue/tutorial?zhuanlanId=j572L2&amp;amp;uuid=19017e996e2444a8b05bf61a3285892f1.&nbsp;非堵塞&nbsp;IO非堵塞&nbsp;IO(Non-blocking&nbsp;IO)是一种输入输出操作的方式,它不会阻塞程序的执行。传统的阻塞&nbsp;IO&nbsp;会使得程序在等待一个操作完成时暂停执行,这可能导致效率低下。非堵塞&nbsp;IO&nbsp;则允许程序继续执行其他任务,直到数据准备好或者操作完成。在&nbsp;Node.js&nbsp;中,很多&nbsp;IO&nbsp;操作(如文件读取、数据库查询和网络请求等)都是非堵塞的。这意味着,发起一个&nbsp;IO&nbsp;操作后,Node.js&nbsp;不会等到操作完成才继续执行后面的代码,而是立即返回,待操作完成时,通过回调函数、Promises&nbsp;或&nbsp;async/await&nbsp;来处理结果。2.&nbsp;事件循环(Event&nbsp;Loop)事件循环(Event&nbsp;Loop)是&nbsp;JavaScript&nbsp;的一种机制,负责管理异步操作的运行。由于&nbsp;JavaScript&nbsp;是单线程的,事件循环的主要目的是协调执行栈(call&nbsp;stack)和事件队列(event&nbsp;queue),处理异步操作。事件循环的工作流程如下:执行栈(Call&nbsp;Stack):所有的&nbsp;JavaScript&nbsp;代码都是在执行栈中执行的。当前执行的任务会被压入栈中,完成后从栈中弹出。事件队列(Event&nbsp;Queue):当异步操作完成(如网络请求、定时器等),相应的回调函数会被放入事件队列中,等待执行栈闲暇时进行处理。事件循环的运行:事件循环会不断检查执行栈是否为空。如果栈为空,它会从事件队列中取出第一个事件,并将其执行(即执行对应的回调函数)。如果执行栈不为空,它会继续执行栈中的任务,直到栈清空。这个机制保证了&nbsp;JavaScript&nbsp;在处理异步任务时的高效性,不会因为等待&nbsp;IO&nbsp;操作而阻塞整个程序的执行。
点赞 评论 收藏
分享
评论
4
8
分享

创作者周榜

更多
牛客网
牛客企业服务