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

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题(建议用时: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 2 2 1

输出:

2

题解

此题直接选取最大的桶来计算要跑几趟即可。时间复杂度

代码实现

C++:

#include<iostream>
using namespace std;

int main() {
    int vol, b1, b2, b3;
    cin >> vol >> b1 >> b2 >> b3;
    int max_cap = max(b1, max(b2, b3));
    int trips = vol / max_cap;
    if(vol % max_cap != 0) trips++;
    cout << trips << endl;
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int waterVol = scan.nextInt();
        int bucket1 = scan.nextInt();
        int bucket2 = scan.nextInt();
        int bucket3 = scan.nextInt();
        
        int maxSize = Math.max(bucket1, Math.max(bucket2, bucket3));
        int tripCount = waterVol / maxSize;
        if (waterVol % maxSize != 0) {
            tripCount++;
        }
        
        System.out.println(tripCount);
    }
}

Python:

def calc_trips():
    water_vol, b_one, b_two, b_three = map(int, input().split())
    max_size = max(b_one, b_two, b_three)
    trips = water_vol // max_size
    if water_vol % max_size:
        trips += 1
    return trips

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

题目 2: 捉迷藏游戏

题目描述

小基(R)、小柯(B)和小兰(G)正在一个字符串上玩捉迷藏。他们所在的位置用对应字母表示,其他位置为空地('*')或障碍('#')。寻找方可以每秒移动一个位置,躲藏方不能移动。当寻找方移动到躲藏方的位置时,躲藏方被认为被找到。但是在过程中,双方均不可以移动到障碍上。

输入格式

在一行上输入一个仅由"*#RGB"组成的字符串 ,保证"RGB"各只出现一次。

输出格式

在一行上输出三个整数,代表小基、小柯和小兰作为寻找方时,能够获胜的最少时间;如果无法获胜,则直接输出

样例

输入:

R***B**G

输出:

4 3 3

题解

直接模拟即可,找出三个人的位置,分别从三个人的位置出发,向字符串左右扫描寻找其他两人的位置并记录,碰见障碍则终止。时间复杂度

代码实现

C++:

#include<iostream>
using namespace std;

int find_min_time(string& s, int pos) {
    int t1 = 1e9, t2 = 1e9;
    
    auto check_pos = [&](int i, int dist) {
        if(s[i] == 'R' || s[i] == 'G' || s[i] == 'B') {
            if(t1 != 1e9) t2 = dist;
            else t1 = dist;
        }
    };
    
    for(int i = pos-1; i >= 0; i--) {
        if(s[i] == '#') break;
        check_pos(i, pos-i);
    }
    
    for(int i = pos+1; i < s.size(); i++) {
        if(s[i] == '#') break;
        check_pos(i, i-pos);
    }
    
    return (t1 == 1e9 && t2 == 1e9) ? -1 : min(t1, t2);
}

int main() {
    string s;
    cin >> s;
    int r_time = -1, b_time = -1, g_time = -1;
    
    for(int i = 0; i < s.size(); i++) {
        if(s[i] == 'R') r_time = find_min_time(s, i);
        if(s[i] == 'B') b_time = find_min_time(s, i);
        if(s[i] == 'G') g_time = find_min_time(s, i);
    }
    
    cout << r_time << " " << b_time << " " << g_time << endl;
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    static int findMinTime(String str, int pos) {
        int len = str.length();
        int time1 = Integer.MAX_VALUE;
        int time2 = Integer.MAX_VALUE;
        
        // 向左搜索
        for(int i = pos-1; i >= 0; i--) {
            if(str.charAt(i) == '#') break;
            if("RGB".indexOf(str.charAt(i)) >= 0) {
                if(time1 != Integer.MAX_VALUE) {
                    time2 = pos - i;
                } else {
                    time1 = pos - i;
                }
            }
        }
        
        // 向右搜索
        for(int i = pos+1; i < len; i++) {
            if(str.charAt(i) == '#') break;
            if("RGB".indexOf(str.charAt(i)) >= 0) {
                if(time1 != Integer.MAX_VALUE) {
                    time2 = i - pos;
                } else {
                    time1 = i - pos;
                }
            }
        }
        
        return (time1 == Integer.MAX_VALUE && time2 == Integer.MAX_VALUE) ? 
               -1 : Math.min(time1, time2);
    }
    
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.next();
        int[] times = new int[3];
        
        for(int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if(c == 'R') times[0] = findMinTime(str, i);
            if(c == 'B') times[1] = findMinTime(str, i);
            if(c == 'G') times[2] = findMinTime(str, i);
        }
        
        System.out.printf("%d %d %d\n", times[0], times[1], times[2]);
    }
}

Python:

def find_min_time(s: str, pos: int) -> int:
    t1, t2 = float('inf'), float('inf')
    
    def check_pos(i: int, dist: int):
        nonlocal t1, t2
        if s[i] in 'RGB':
            if t1 != float('inf'):
                t2 = dist
            else:
                t1 = dist
    
    # 向左搜索
    for i in range(pos-1, -1, -1):
        if s[i] == '#': break
        check_pos(i, pos-i)
    
    # 向右搜索
    for i in range(pos+1, len(s)):
        if s[i] == '#': break
        check_pos(i, i-pos)
    
    return -1 if t1 == float('inf') and t2 == float('inf') else min(t1, t2)

def main():
    s = input().strip()
    times = [-1] * 3
    
    for i, c in enumerate(s):
        if c == 'R': times[0] = find_min_time(s, i)
        elif c == 'B': times[1] = find_min_time(s, i)
        elif c == 'G': times[2] = find_min_time(s, i)
    
    print(*times)

if __name__ == "__main__":
    main()

题目 3: 砖块合成

题目描述

小基有 个红砖、 个蓝砖和 个绿砖。每 个红砖可以合成 个蓝砖,每 个蓝砖可以合成 个绿砖。砖块只能正向合成,不能反向分解。一套砖块包含 个红砖、 个蓝砖和 个绿砖。请计算小基最多可以收集多少套砖块。

输入格式

第一行输入一个整数 代表数据组数。 每组数据输入五个整数

输出格式

对于每组数据,输出一个整数,代表最多可以收集到的砖块套数。

样例

输入:

2
1 2 3 4 2
10 2 1 4 2

输出:

1
2

题解

使用二分查找,每次求出一个 mid 后,将大于 mid 的红砖和蓝砖全部合成,若最后三种砖数量均大于等于 mid,则将左端点置为 mid,否则将右端点置为 mid-1。时间复杂度

代码实现

C++:

#include<iostream>
using namespace std;
typedef long long ll;

ll solve_case() {
    ll red, blue, green, x_rate, y_rate;
    cin >> red >> blue >> green >> x_rate >> y_rate;
    
    ll left = 0, right = 1e9;
    while(left < right) {
        ll mid = (left + right + 1) / 2;
        ll r = red, b = blue, g = green;
        
        if(r > mid) {
            ll conv = (r - mid) / x_rate;
            r -= x_rate * conv;
            b += conv;
        }
        
        if(b > mid) {
            ll conv = (b - mid) / y_rate;
            b -= y_rate * conv;
            g += conv;
        }
        
        if(r >= mid && b >= mid && g >= mid)
            left = mid;
        else
            right = mid - 1;
    }
    return left;
}

int main() {
    int test_cnt;
    cin >> test_cnt;
    while(test_cnt--) cout << solve_case() << endl;
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    static long solveCase(Scanner 

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

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

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

全部评论

相关推荐

代码飞升_不回私信人...:别这样贬低自己,降低预期,放平心态,跟昨天的自己比。做好自己,反而会效率更高心态更好,加油兄弟
点赞 评论 收藏
分享
秋招投简历提醒助手:个人经验是,一般面二十场左右就会进入侃侃而谈阶段。我今年七月末的时候开始的第一次面试,都是很多不会,回复很慢。后面慢慢迭代,到九月中的时候基本上面啥说啥,很放松的状态
远程面试的尴尬瞬间
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务