【笔试刷题】淘天-2026.04.11-研发岗-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🤖 内容包含AI辅助生成,题解和代码均经过多轮验证,有问题欢迎评论

🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

淘天-2026.04.11-研发岗

题目总览

题号 题名 主要做法 难度
1 模乘循环数 状态模拟 + 判重 简单
2 逆转 贪心构造 中等
3 果酱平衡 分组 DP + 前缀差值 困难

这套研发岗的节奏是前面两题先把规律抓出来,最后一题再把限制压到统一模型里。第一题很直接,第二题要反着想筛选过程,第三题则要把“每行只能删前缀”拆成若干可选差值后再做最优转移。

1. 小兰的模乘循环数

问题描述

小兰在阿笠博士的实验台上放了一个数字显示器,初始值固定为 1
接下来设备会反复执行下面这条更新规则:

因为每次都会取模,所以状态迟早会再次出现。
现在请你统计:从初始状态开始,整个过程一共会出现多少个不同的数。

输入格式

输入一行两个整数 k, m

输出格式

输出一个整数,表示出现过的不同状态个数。

样例输入

2 10

样例输出

5

样例说明

状态序列依次是 1 -> 2 -> 4 -> 8 -> 6 -> 2 -> ...
从第二次遇到 2 开始,后面的变化会重复,所以不同状态共有 1,2,4,8,65 个。

数据范围

  • 0 <= k <= 10^6
  • 1 <= m <= 10^6

题解

这一题不需要推复杂公式,直接照着转移规则往下走就够了。

如果某个状态第一次出现,我们把它记下来,然后继续转移到下一个状态;一旦某个值已经访问过,说明后续过程会进入循环,不会再产生新状态。

有一个细节要单独提一下:当 m = 1 时,第一次更新之后一定变成 0,但初始状态里的 1 也算出现过,所以答案是 2

参考代码(Python)

import sys


def solve() -> None:
    # Read input in ACM mode and build the answer directly.
    k, m = map(int, sys.stdin.readline().split())
    if m == 1:
        print(2)
        return

    seen = bytearray(m)
    cur = 1
    cnt = 0
    while not seen[cur]:
        seen[cur] = 1
        cnt += 1
        cur = (cur * k) % m
    print(cnt)


if __name__ == "__main__":
    # Standard ACM entry.
    solve()

2. 园子的逆转

问题描述

园子先写出了一个正整数序列 a,然后按下面的规则从左到右扫描它,得到一个保留下来的序列 b

  • 第一个数 a1 一定保留;
  • 对于后面的每个位置 i,如果 a[i - 1] + d <= a[i],那么 a[i] 会进入 b
  • 否则这个数会被丢掉。

现在只给你阈值 d 和最终留下来的序列 b
你需要反过来构造一个合法的原序列 a,并满足:

  • 长度尽量短;
  • 在所有最短方案中,字典序尽量小。

题目保证一定存在解。

输入格式

第一行输入整数 T,表示测试组数。
每组数据包含两行:

  • 第一行输入 n, d
  • 第二行输入 n 个整数,表示序列 b

输出格式

对每组数据输出两行:

  • 第一行输出构造出的长度;
  • 第二行输出构造出的序列。

样例输入

2
3 2
5 6 8
4 0
2 1 1 3

样例输出

4
5 1 6 8
5
2 1 1 1 3

样例说明

第一组里,5 后面不能直接接 6,因为 5 + 2 > 6
所以需要先插一个会被跳过的数。取最小正整数 1 时,5 + 2 > 1,而 1 + 2 <= 6,于是 6 就能被顺利保留下来。

第二组里 d = 0,判断条件变成“前一个数不大于当前数”。
在两个保留值之间补一个最小的 1,可以同时满足最短和字典序最小。

数据范围

  • 1 <= T <= 10^4
  • 1 <= n <= 2 * 10^5
  • 0 <= d < 10^9
  • 1 <= b[i] <= 10^9
  • 所有测试数据的 n 之和不超过 2 * 10^5

题解

看相邻两个保留值之间要发生什么就行。

假设当前已经让 b[i - 1] 出现在原序列末尾,现在想让 b[i] 被保留下来:

  • 如果 b[i - 1] + d <= b[i],那就直接把 b[i] 接上;
  • 如果不满足,说明 b[i] 不能紧跟在 b[i - 1] 后面,否则它会被跳过。

这时至少要插入一个额外数字。
为了让总长度最短,我们只插一个数;为了让字典序最小,这个数应当尽量小,取 1 最合适。

于是整题就成了一个很直接的贪心:

  • 能直接接,就直接接;
  • 不能直接接,就先插入 1,再放当前这个保留值。

参考代码(Python)

import sys


def solve() -> None:
    input = sys.stdin.readline
    t = int(inpu

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

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

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

全部评论

相关推荐

04-11 20:32
已编辑
中南大学 后端工程师
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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