【笔试刷题】团子-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

样例说明

  • 第一组里可以选盒 ,拿出 ,总和为
  • 第二组里只有一个双元素盒和一个单元素盒,任选那个只装着 的单元素盒即可。
  • 第三组所有数都是偶数,不可能拼出奇数和。

数据范围

  • 单个测试文件中所有 的总和不超过

题解

这题只需要先看清“每个盒子能提供什么奇偶性”。

把每个盒子分成三类:

  1. 固定偶盒:盒里只能拿到偶数。
  2. 固定奇盒:盒里只能拿到奇数。
  3. 可调盒:盒里一个奇数、一个偶数,可以按需要拿成奇数,也可以拿成偶数。

设这三类盒子的数量分别是:

  • evenBox
  • oddBox
  • flexBox

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. 当 时,把最长长度固定成

只要整个串只使用两个字母,比如 ab,那么:

  • 任意长度为 的子串都不可能三个字符互不相同;
  • 所以最长无重复子串的长度最多是

如果串里至少存在一对相邻不同字符,那么最长无重复子串长度就恰好是

这时奇怪度等于什么?

就是:

  • 长度为 且两个字符不同的子串个数;
  • 也就是相邻位置里满足 的位置数。

所以问题又变成:

  • 构造一个长度为 的只含 a/b 的字符串,
  • 让相邻不同的位置数恰好等于

3. 构造办法

时:

  1. 先把前 个字符写成严格交替:
ababab...
  1. 再把后面的所有字符都写成和第 个字符相同。

例如 时:

abbbbbbb   不对
ababbbbb   对

第二种串中:

  • 前三对相邻字符分别不同;
  • 从第 位开始全部相同,不再增加新的“相邻不同”位置。

于是恰好有 个长度为 的无重复子串,奇怪度就是

4. 为什么一定合法

  • 时,构造串中至少有一个 abba,所以最长无重复子串长度至少为
  • 串中只用了两种字母,所以最长无重复子串长度不可能超过
  • 因此最长长度恰好为
  • 而满足长度为 且无重复的子串数量,正好就是我们控制出的 个相邻不同位置。

所以这份构造一定正确。

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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

第一章&nbsp;深夜BUG凌晨两点十七分,林栖迟第十七次运行了那个程序。屏幕上弹出一行红色的报错信息,和之前十六次一模一样。她盯着那行字看了五秒钟,然后以一种近乎虔诚的姿态,把脸埋进了键盘里。“你到底要我怎样?”键盘发出了抗议的嗒嗒声,像是在说“关我什么事”。林栖迟抬起头,把额前的碎发撩到耳后,露出一张因为熬夜而显得有些苍白的脸。她今年二十四岁,在一家不算大也不算小的互联网公司做后端开发,入职两年,加班时长累计可以绕地球一圈——当然这是夸张,但她的黑眼圈不是夸张。今天的BUG尤其离谱。一个本该在测试环境跑得好好的接口,上了预发布环境就罢工,没有任何日志,没有任何报错,就像被人掐住了喉咙,无声无息地死掉了。她从晚上九点排查到现在,改了十七个版本,没有一个能跑通。“林栖迟,你是废物吗?”她对自己说。“你不是废物。”一个声音从身后传来。林栖迟猛地回头,差点从椅子上摔下去。公司深夜的开放式办公区空旷而安静,只有她头顶的一盏灯还亮着,在周围投下一个惨白的光圈。而在这个光圈的边缘,站着一个男人。他穿着一件深色的连帽卫衣,帽子没有拉起来,露出一头略长的黑发,有些凌乱地垂在额前。他的五官很深,眉骨高而窄,鼻梁挺拔,嘴唇的线条干净利落,整个人像是一幅用炭笔勾勒的素描,轮廓分明但色调偏冷。他的眼睛是深棕色的,在昏暗的灯光下几乎看不出颜色,只有瞳孔深处有一点微弱的光,像是冬天夜晚最后熄灭的那颗星。林栖迟不认识他。“你是谁?”她问,手已经摸到了桌上的一本《代码大全》,准备随时当板砖用。“我在十七楼上班。”男人说,“产品部。”“产品部?”林栖迟的警惕心下降了一点,但困惑上升了十倍,“产品部的人来技术部干嘛?你们不是应该在楼上喝咖啡想需求吗?”男人的嘴角微微动了一下——不是笑,更像是一种“果然如此”的表情。“我来找你。”“找我?为什么?”“因为你的代码。”林栖迟下意识地看了一眼自己的屏幕,上面还挂着那行红色的报错信息。她赶紧把屏幕关了,转过身来。“你看到了?”“看到了。”男人走过来,在她旁边的工位坐下,“你卡在预发布环境的问题,我帮你看看。”林栖迟瞪大了眼睛:“你是产品经理,你懂代码?”“我写代码的时候你可能还在高考。”“……你多大?”“二十八。”“那你二十二就写代码了?”林栖迟算了算,“你是哪个学校毕业的?”男人没有回答这个问题。他伸手按亮了她的屏幕,扫了一眼报错信息,然后说了一句让她血压飙升的话。“你第十七版的代码逻辑是对的,但有个配置文件的路径写错了。”“不可能,我检查了所有路径——”男人修长的手指在键盘上敲了几下,打开了那个配置文件,光标停在第三行。林栖迟凑过去一看,瞳孔骤然收缩。她写的是:config.load(“./config/production.yaml”)而他改成了:config.load(“./config/preproduction.yaml”)“预发布环境和生产环境用的配置文件不一样,你的代码里写死了路径,环境变量没生效。”男人的声音很平淡,像是在解释为什么一加一等于二。林栖迟盯着那个改过的配置文件,沉默了整整十秒钟。“所以,我花了五个小时,十七个版本,就是因为这个?”“因为一个字母。”男人纠正。“preproduction比production多了三个字母!”“但你错的是路径,不是字母数。”林栖迟深吸一口气,缓缓吐出。她有一种强烈的冲动,想把面前的显示器吃掉,这样她就不用面对这个残酷的事实了。“谢谢。”她咬着牙说,“你叫什么名字?”“沈砚辞。”“沈砚辞。”林栖迟重复了一遍,总觉得这个名字在哪里听过,但脑子因为熬夜已经变成了一锅粥,怎么也想不起来,“你是哪个产品线的?”“不重要。”沈砚辞站起来,拉了拉卫衣的帽子,“代码能跑了就行。”他转身走了两步,忽然停下来,回头看了她一眼。“林栖迟。”“嗯?”“你写代码的习惯不太好。变量命名太随意,注释太少,异常处理太粗糙。”他的语气依然是那种不带感情的陈述,“但你解决问题的思路是对的,只是在细节上容易钻牛角尖。多休息,脑子清醒了再写。”林栖迟张了张嘴,想说“你谁啊你凭什么评价我的代码”,但话到嘴边变成了:“你怎么知道我容易钻牛角尖?”沈砚辞看了她一眼。“因为你改了十七个版本,每一版都换了一种思路,但没有一版回到最初的问题去检查最基本的配置。这是典型的钻牛角尖——你觉得问题一定很复杂,所以一直在往复杂的方向找,反而忽略了最简单的可能性。”林栖迟沉默了。这个人说的每一个字都对,这让她很不爽。沈砚辞没有等她反驳,拉上帽子,走进了电梯。电梯门关上的瞬间,林栖迟看到他的侧脸在电梯的灯光下显得格外冷峻,像一座被雪覆盖的山。她转过头,看着屏幕上那个终于跑通的程序,心里的感觉很奇怪——不是如释重负,不是感激,而是一种被看穿的、无处可逃的窘迫。她打开搜索引擎,输入“沈砚辞&nbsp;产品部”,结果让她倒吸了一口凉气。沈砚辞,江城大学计算机系博士毕业,曾在硅谷某顶级科技公司担任技术总监,三年前回国,加入现在的公司担任首席产品官。业内人称“疯子”——不是贬义,是因为他的产品嗅觉极其敏锐,总能提前半年到一年押中风口,做出的产品一个比一个离谱,但一个比一个成功。最重要的是,他是公司创始人之外最大的个人股东,身家至少十几个亿。林栖迟关掉了搜索页面,把脸埋进了手心里。“林栖迟,你刚才对着一个身家十几亿的产品大神说‘产品部的人来技术部干嘛’。”“林栖迟,你完了。”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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