【笔试刷题】蚂蚁-2026.04.16-研发岗-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

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

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

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

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

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

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

蚂蚁-2026.04.16-研发岗

题目总览

题号 题名 主要做法 难度
1 合规拆分单 构造 + 特判 简单
2 警戒绳 倒序处理 + 链表维护 中等
3 非互质定位 质因子分解 + 容斥 + 二分 困难

这套蚂蚁研发岗的节奏比较清楚。第一题是分类构造,第二题适合把动态过程倒过来看,第三题则是数论查询题,先把“非互质”拆成质因子命中,后面的结构就会清楚很多。

1. 小兰的合规拆分单

问题描述

本题是蚂蚁 2025.08.21-算法岗1 题的原题。

小兰 要把一笔总量为 的资源拆成若干份登记到系统里。

系统只接受两类单份大小:

  • 恰好等于
  • 合数,也就是大于 且不是质数的正整数。

现在需要构造一个长度至少为 的数组 ,满足:

  • 数组中的每个元素都符合上面的登记规则;
  • 数组所有元素之和恰好等于

如果存在多种可行方案,先要求数组长度最短;如果最短方案不唯一,输出任意一种即可。

输入格式

第一行输入一个整数 ,表示测试数据组数。

接下来 行,每行输入一个正整数

输出格式

对于每组数据:

  • 第一行输出一个整数 ,表示构造出的数组长度;
  • 第二行输出 个整数,表示这个数组中的元素。

如果最短方案不唯一,输出任意一种都可以。

样例输入

3
8
10
2

样例输出

2
4 4
2
4 6
2
1 1

数据范围

样例说明

  • 样例 1:当 时,取 即可;当 时, 也是长度为 的合法方案;当 时,只能取

题解

先问自己,什么时候能做到长度为

如果答案长度是 ,那就相当于要把 拆成 ,并且 都必须是 或合数。

最自然的两种尝试是:

  • 去凑,也就是看 能不能合法;
  • 用一个固定的合数去凑,也就是看剩下那部分能不能合法。

奇数情况最简单

是奇数并且 时, 是一个不小于 的偶数。

任何不小于 的偶数都是合数,所以这时直接输出:

长度就是

偶数情况只要再分一类

是偶数时:

  • 如果 ,那么 是一个不小于 的偶数,同样一定是合数;
  • 所以这时可以直接输出 ,长度还是

这样一来,除了很小的几个数,其余情况都能两项解决。

小数值单独判断

剩下只需要把最小的几个值手工列出来:

  • 时,只能是 ,长度为
  • 时,长度为 不可能,因为 里的 不是合法值,所以只能是
  • 时,长度为 不可能,长度为 也不可能,最短只能是
  • 时,长度为 的拆法只有 ,都不合法,所以最短是

算法流程

每组数据直接按下面的顺序判断:

  1. 如果 ,输出 1 1
  2. 如果 ,输出 1 1 1
  3. 如果 ,输出 1 1 1 1
  4. 如果 ,输出 1 1 4
  5. 如果 是奇数,输出 1n-1
  6. 否则输出 4n-4

复杂度分析

每组数据都只做常数次判断。

  • 时间复杂度:
  • 空间复杂度:

参考代码(Python)

import sys

input = lambda: 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):
        n = int(input())

        # 下面四个值是唯一需要单独特判的小范围答案。
        if n == 2:
            out.append("2")
            out.append("1 1")
            continue
        if n == 3:
            out.append("3")
            out.append("1 1 1")
            continue
        if n == 4:
            out.append("4")
            out.append("1 1 1 1")
            continue
        if n == 6:
            out.append("3")
            out.append("1 1 4")
            continue

        # 奇数且至少为 5 时,n-1 是不小于 4 的偶数,一定是合数。
        if n & 1:
            out.append("2")
            out.append(f"1 {n - 1}")
        else:
            # 偶数且不是 2、4、6 时,至少为 8,此时 n-4 也是合数。
            out.append("2")
            out.append(f"4 {n - 4}")

    sys.stdout.write("\n".join(out))


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

2. 园子的警戒绳

问题描述

本题是蚂蚁 2025.05.08-研发岗2 题的原题。

园子在一根长度为 的绳子上等距标了 个点,编号为 ,相邻两个点之间的距离都是

她会进行 次操作,每次操作属于下面两种之一:

  • 1 x:在点 处画一条红线。
  • 2 k:假设把当前所有画过红线的位置全部剪开,询问是否还存在长度至少为 的绳子段。

注意:

  • 剪断只是假设,不会真的改变后续操作;
  • 每次询问二都基于“当前已经画过的所有红线”独立计算。

输入格式

第一行输入两个整数 ,分别表示点的数量和操作次数。

接下来 行,每行输入一组操作:

  • 如果操作类型为 1,则这一行是 1 x
  • 如果操作类型为 2,则这一行是 2 k

输出格式

对于每个类型为 2 的询问:

  • 如果存在长度至少为 的绳子段,输出 YES
  • 否则输出 NO

样例输入

8 7
2 7
1 4
2 4
2 5
1 6
2 3
2 4

样例输出

YES
YES
NO
YES
NO

数据范围

样例说明

  • 样例 1:初始时整根绳子的长度是 ,所以第一问是 YES。画上红线 以后,绳子被分成长度 的两段,所以对 回答 YES,对 回答 NO。再画上红线 后,三段长度分别是 ,于是最后两问分别是 YESNO

题解

正着做需要维护“当前最大段”

如果按照题目原顺序处理,操作只有“加红线”,没有“删红线”。

一条红线会把某一段绳子拆成两段,所以正着做通常会想到:

  • 用有序集合维护所有红线位置;
  • 用另一个结构维护所有段长的最大值。

这个思路本身没有问题,不过这里还有一个更适合三语言统一实现的做法。

反过来看,问题会简单很多

把所有操作倒过来考虑:

  • 原来的“加一条红线”,在倒序里就变成“删掉一条红线”;
  • 原来的询问,依然只是问当前最大段长是否至少为

删掉一条红线时会发生什么?

  • 这条红线左右两边原本有两段绳子;
  • 去掉以后,这两段会合并成一整段;
  • 因此当前最大段长只会变大,不会变小。

这就带来了一个很关键的性质:

  • 在倒序处理中,只需要维护一个变量 mx 表示当前最大段长;
  • 每次删红线时,用合并后的新段长去更新 mx 即可;
  • 不需要再维护“段长 multiset”这种会删除元素的结构。

怎么快速知道一条红线左右是谁

先把所有出现过的红线位置收集出来,再加上两端点 1n,排序后记为数组 pts

然后把这些点看成一条双向链表:

  • left[i] 表示当前还保留的、pts[i] 左边最近的点;
  • right[i] 表示当前还保留的、pts[i] 右边最近的点。

倒序删除位置 x 时:

  1. 找到它在 pts 中的下标 id
  2. 设左右相邻点下标分别是 LR
  3. 删除 x 后,新段长就是 pts[R] - pts[L]
  4. 用这个值更新 mx
  5. 再把链表改成 L <-> R

为什么这样是对的

倒序某一时刻保留的红线集合,正好对应原顺序同一时刻已经画出的红线集合。

所以:

  • 倒序里的当前绳段划分,和原题当前询问时的绳段划分完全一致;
  • mx 就是这一时刻真正的最大段长;
  • 对于询问 2 k,只需要判断 mx \ge k 即可。

还要注意重复画线

如果某个位置在输入里被多次执行了 1 x,倒序时不能每次都真的删掉它。

做法很简单:

  • 先统计每个位置总共被画了多少次;
  • 倒序遇到一次 就把计数减

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

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

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

全部评论

相关推荐

🐜ai&nbsp;infra一面1、面试官人真好啊,自我介绍完我就说我的项目偏业务,看jd上的模型训练、模型推理我都没搞过。他说没事,数据库啊啥的都会涉及到。后面果然一句infra的都没问,哈哈白看了一个周末的infra理论了。2、然后拷问第二个项目。2.1&nbsp;你这个LangGraph路由是如何设计的,为什么要用它?本质是个状态机,定义了xx状态,实现思路(全局状态、node定义、workflow串起来节点)2.2&nbsp;源数据是什么?如何做的预处理?论文pdf,向量那一路用的固定长度token+overlap,语义切分那一路按段落切的(回车)2.3&nbsp;评估是怎么做的?怎么判断切的好不好?其实我没做Recall@k这些,于是扯我做了证据溯源2.4&nbsp;你用GraphRAG了吗,怎么样,有什么优缺点?用了,优点就是对特定专业领域,比如需要检索一些关键词的隐含关系的场景(科研)上效果好,(面试官补充:源数据准确),缺点就是离线阶段有点耗时,比如二三十篇论文的话差不多二十来分钟,单卡跑的话。(面试官说那已经很快了)3、拷问第一个项目。3.1&nbsp;为什么做这样一个项目,出发点是什么?我看你部署到vercel了,怎么样?vercel没跑通(尴尬,面试官怎么知道我传到vercel了)3.2&nbsp;web端还是移动端?以一个用户的角度,进去后可以干嘛?3.3&nbsp;你这个姿态分析是怎么做的?视频是放在minio里,然后是怎么处理的?我一开始说我调了MediaPipe&nbsp;pose的库做姿态识别,识别到人体关机的三十多个点,然后点点相连成为向量,用cos做相似度分析,最后打分,调llm做个总评。面试官一直在追问这里,说视频具体是如何分析的,有没有什么难点。我有点没听懂,他说他的出发点是觉得调库+向量相似&nbsp;会有些简陋。唉能不简陋吗,我就开始扯我遇到了两个视频如何对齐的问题,目前的解决方式是设置了个滑杆用户手动调节这个偏差,后期的话可以考虑用音乐来实现。3.4&nbsp;redis缓存了什么数据?是什么类型的?key和val分别是什么?列表内部的数据究竟是什么?有没有涉及到序列化啥的?唉这块是真尴尬,我只从功能上说了我缓存了用户自己的视频列表和姿态分析的结果。等下快去补补好嘛好的。3.5&nbsp;如果一个用户上传了个非常大的视频会怎么样,比如几G?我说我做了限流,只可以上传小于500MB的,然后也限制了一个用户一分钟只能执行两次ai分析。他就追问说,如果我现在这个视频就是很大又必须要上传呢?我就说那可以设置个会员功能,付费才能上传大视频。哈哈哈哈面试官笑了一下3.6&nbsp;MQ为什么用RabbitMQ?我就说RabbitMQ简单,可以满足可靠性。追问可靠性是如何实现的?发送端生产者开启确认机制,存储端设置队列持久化、消息持久化,消费端任务完成之后再ack,还设置了死信队列用来兜底。追问消息进入死信队列会被如何处理?答不上这个。只回答了什么时候会触发死信队列。4、ai&nbsp;相关。你这个aicoding笔试,我看你问了个“云原生架构是什么”,“会被aicoding取代吗”,真想找个角钻了,原来面试官还能看到我当时的prompt啊,然后他就问我会不会被取代。你是如何看待ai&nbsp;coding的发展的?如何提升aicoding的能力?唉当时顺不好口条,面试官又让我总结了一下我想说啥。5、开放题假如有一个业务需要你用agent实现,如何设计?&nbsp;需要考虑什么?我问什么场景,他说假设现在有个很厉害的agent来做姿态分析,而不是传统后端这一套了,如何达到生产级别?我说我实在是不懂多模态,如果是文本信息的话,生产级别肯定需要考虑多个用户同时访问的并发压力,比如看有没有一些请求能够合并,或者看这些请求有没有通用/复用的地方,设置个缓存来提高响应速度。面试官问还有啥嘛?then,我大脑空白了几秒钟。憋出来个,或许还可以预训练个模型,搞个舞蹈学习的垂直模型?还有啥需要考虑的,想不出来了。6、反问反问了业务,面试官说了一大串,完全没听懂。反问了agent在业务中如何体现。反问了那您觉得aicoding会取代程序员嘛哈哈哈哈总共50来min,无手撕,好煎熬好漫长的50min。
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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