【笔试刷题】团子-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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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