【备战春招必看】美团2025届春招第12套笔试解析 | 大厂真题通关指南
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题(建议用时:90分钟/套)
- 对照解析查漏补缺
- 配套练习题库
互联网必备刷题宝典🔗
📢 美团技术岗笔试重要信息速览
⏰ 笔试时间安排
- 常规场次:每周六交替进行
- 上午场 10:00~11:30
- 晚间场 19:00~20:30
- 通知时间:每周四/五通过邮箱发送考试链接
🧩 笔试题型分布
| 算法岗 | 选择题 + 5道编程 |
| 后端开发岗 | 选择题 + 3道编程 |
| 前端/测试岗 | 选择题 + 2道编程 |
⚙️ 考试设置要点
- 考试平台:牛客网(ACM模式)
- 监考要求:
- 必须开启笔记本前置摄像头
- 禁止使用手机(需小程序锁定)
- 允许使用本地IDE
- 编程规范:
- 严格遵循输入输出格式
- 注意时间复杂度控制(通常1s对应1e8次运算)
📚 笔试经验贴
(所有展示题面均已进行改编处理,保留核心考点)
本题库收录整理自:
- 互联网公开的笔试真题回忆版(经网友投稿)
- 各大技术社区公开讨论的经典题型
- 历年校招考生提供的解题思路
🔍 题库特点:
- 100%真实笔试场景还原
- 包含高频考点题型
- 提供多语言实现参考
- 持续更新2024届最新真题
⚠️ 注意事项:
- 所有题目均来自公开渠道,已进行改编脱敏处理
- 实际笔试可能出现题型变化,请以官方通知为准
🚀 春招备战指南
金三银四求职季即将到来!这里整理了最新美团真题及解析,助你快速掌握笔试套路。建议重点突破以下题型:
- 数组/字符串操作
- 树形结构应用
- 贪心/动态规划
- 区间合并问题
(👇 下附最新笔试真题及详细解析 👇)
真题详解(改编版)
题目 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%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力