【笔试刷题】团子-2026.04.11-研发岗-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🤖 内容包含AI辅助生成,题解和代码均经过多轮验证,有问题欢迎评论
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
团子-2026.04.11-研发岗
题目总览
| 题号 | 题名 | 主要做法 | 难度 |
|---|---|---|---|
| 01 | 选盒子 | 分类计数 | 简单 |
| 02 | 构造字符串 | 约束合并 + 构造 | 中等 |
| 03 | 函数图求和 | 函数图分解 | 困难 |
这场 4 月 11 日的美团研发岗前后手感差得很明显。第一题主要是判断,第二题开始要先把窗口约束理平,第三题再落到函数图模型,写法如果不够整洁,后两题会很容易在细节上反复返工。
01. 小兰的奇偶盒子挑选
问题描述
小兰把一段长度为 的整数序列按顺序打包成若干个“小盒子”。
- 第
个盒子装的是
;
- 第
个盒子装的是
;
- 依此类推;
- 如果
是奇数,那么还会剩下一个单元素盒
。
现在他需要恰好选出 个盒子,并且从每个被选中的盒子里拿出且仅拿出一个数。
小兰希望拿出的这些数之和是奇数。请你判断是否存在一种选择方案。
输入格式
每个测试文件包含多组数据。
第一行输入一个整数 ,表示测试数据组数。
对于每组数据:
- 第一行输入两个整数
;
- 第二行输入
个整数
。
输出格式
对于每组数据:
- 如果存在合法方案,输出
Yes; - 否则输出
No。
样例输入
3
5 2
1 2 3 4 5
3 1
1 3 5
5 3
2 2 2 2 2
样例输出
Yes
Yes
No
样例说明
- 第一组里可以选盒
和
,拿出
与
,总和为
。
- 第二组里只有一个双元素盒和一个单元素盒,任选那个只装着
的单元素盒即可。
- 第三组所有数都是偶数,不可能拼出奇数和。
数据范围
- 单个测试文件中所有
的总和不超过
题解
这题只需要先看清“每个盒子能提供什么奇偶性”。
把每个盒子分成三类:
- 固定偶盒:盒里只能拿到偶数。
- 固定奇盒:盒里只能拿到奇数。
- 可调盒:盒里一个奇数、一个偶数,可以按需要拿成奇数,也可以拿成偶数。
设这三类盒子的数量分别是:
evenBoxoddBoxflexBox
1. 只要选到了可调盒,答案就一定是 Yes
因为题目要求恰好选 个盒子,而输入保证
不会超过盒子总数。
如果我们选出的 个盒子里至少有一个可调盒,那么一步总可以通过它来“修正奇偶性”:
- 前面若已经凑成偶数,就让它贡献奇数;
- 前面若已经凑成奇数,就让它贡献偶数。
所以:
- 只要
flexBox > 0,答案直接就是Yes。
2. 没有可调盒时,只能靠固定奇盒的个数来决定
这时每个被选盒子的贡献奇偶性都已经固定了。
如果选了 个固定奇盒、
个固定偶盒,那么总和是奇数,当且仅当:
是奇数。
同时还要满足数量限制:
把第二个条件整理一下,得到:
所以问题就变成:
- 这个区间里是否存在一个奇数。
如果存在,输出 Yes;否则输出 No。
3. 复杂度
每个盒子只会被扫一遍。
- 时间复杂度:
- 空间复杂度:
(不计输入数组)
参考代码(Python)
import sys
def input() -> str:
return sys.stdin.readline().strip()
def solve() -> None:
# Read input in ACM mode and build the answer directly.
t = int(input())
out = []
for _ in range(t):
# Process each test case independently.
n, x = map(int, input().split())
arr = list(map(int, input().split()))
even_box = 0
odd_box = 0
flex_box = 0
i = 0
while i < n:
if i + 1 == n:
if arr[i] & 1:
odd_box += 1
else:
even_box += 1
else:
p1 = arr[i] & 1
p2 = arr[i + 1] & 1
if p1 != p2:
flex_box += 1
elif p1 == 1:
odd_box += 1
else:
even_box += 1
i += 2
if flex_box > 0:
out.append("Yes")
continue
left = max(0, x - even_box)
right = min(x, odd_box)
first_odd = left if left & 1 else left + 1
out.append("Yes" if first_odd <= right else "No")
print("\n".join(out))
if __name__ == "__main__":
# Standard ACM entry.
solve()
02. 小兰的奇怪字符串构造
问题描述
我们把一个仅由小写字母组成的字符串 的奇怪度定义为:
- 在
的所有“字符互不重复”的子串里,
- 先找出其中的最大长度,
- 再统计有多少个子串达到了这个最大长度。
这里按起止位置计数,不按子串内容去重。
现在给定两个整数 和
,请你构造一个长度恰好为
的小写字母串,使它的奇怪度恰好等于
。
如果不存在这样的字符串,输出 -1。
如果有多种合法构造,输出任意一种都可以。
输入格式
一行两个整数 。
输出格式
- 如果无解,输出
-1; - 否则输出一个长度为
的合法字符串。
样例输入 1
5 3
样例输出 1
ababb
样例输入 2
5 3
样例输出 2
ababb
数据范围
题解
这题要先把目标换个角度看:核心是控制最长无重复子串的长度。
1. 当
时最简单
如果整个串都写成同一个字母,比如:
aaaaa...a
那么:
- 任意长度大于
的子串都会出现重复字母;
- 所以最长无重复子串的长度只能是
;
- 长度为
的子串一共有
个。
因此奇怪度正好就是 。
2. 当
时,把最长长度固定成 
只要整个串只使用两个字母,比如 a 和 b,那么:
- 任意长度为
的子串都不可能三个字符互不相同;
- 所以最长无重复子串的长度最多是
。
如果串里至少存在一对相邻不同字符,那么最长无重复子串长度就恰好是 。
这时奇怪度等于什么?
就是:
- 长度为
且两个字符不同的子串个数;
- 也就是相邻位置里满足
的位置数。
所以问题又变成:
- 构造一个长度为
的只含
a/b的字符串, - 让相邻不同的位置数恰好等于
。
3. 构造办法
当 时:
- 先把前
个字符写成严格交替:
ababab...
- 再把后面的所有字符都写成和第
个字符相同。
例如 时:
abbbbbbb 不对
ababbbbb 对
第二种串中:
- 前三对相邻字符分别不同;
- 从第
位开始全部相同,不再增加新的“相邻不同”位置。
于是恰好有 个长度为
的无重复子串,奇怪度就是
。
4. 为什么一定合法
- 当
时,构造串中至少有一个
ab或ba,所以最长无重复子串长度至少为;
- 串中只用了两种字母,所以最长无重复子串长度不可能超过
;
- 因此最长长度恰好为
;
- 而满足长度为
且无重复的子串数量,正好就是我们控制出的
个相邻不同位置。
所以这份构造一定正确。
5. 复杂度
只需要线性构造一次字符串。
- 时间复杂度:
- 空间复杂度:
参考代码(Python)
def solve() -> None:
n, k = map(int, input().split())
if k == n:
print("a" * n)
return
chars = []
for i in range(k + 1):
chars.append('a' if i % 2 == 0 else 'b')
last = chars[-1]
chars.extend(last for _ in range(n - (k + 1)))
print("".join(chars))
if __name__ == "__main__":
# Standard ACM entry.
solve()
03. 小兰的唯一路线价值
问题描述
在一张有 个城市的路线图里,每个城市都只会把人送到一个固定的下一站。
具体地,对于每个城市 ,都给出一个整数
,表示如果当前人在城市
,下一次一定会前往城市
。
小兰从某个起点城市出发,会不断沿着这张路线图前进。每次到达城市时,他都会获得一笔价值:
- 如果这是他第
次来到城市
,那么这一次会获得
的价值。
现在有 个询问。每个询问给出两个整数
,表示:
- 从城市
开始出发;
- 一共统计前
次“来到城市”的过程(包含最开始站在
的那一次)。
请你输出这 次过程中总共获得的价值,并对
取模。
输入格式
第一行输入两个整数 ,表示城市个数和询问个数。
第二行输入 个整数
,其中
表示从城市
会前往的下一座城市。
接下来 行,每行输入两个整数
,表示一个询问。
输出格式
对于每个询问输出一行一个整数,表示答案对
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
