写在前面
本次给大家带来2026年8月15日阿里工程岗笔试题的1道题,本场机考题目可在咱们平台上在线刷题。
第一题:选择题
塔子哥的配套刷题网站:codefun2000.com
第1题-选择题
1.单选题
1、评审创建订单接口的幂等方案时,同一业务操作会复用幂等键,且单次下单最长可能耗时 2 分钟。下列哪种实现在重试时仍可能写出重复订单?{{ select(1) }}
用数据库行锁占用幂等键,订单完成后写入订单号,重试方等待并读取同一结果 用 30 秒后过期的缓存键拦截重复请求,键不存在时直接允许创建订单 在订单表为幂等键建立唯一约束,并在同一事务内保存订单与返回结果 写入受唯一约束保护的持久化处理中记录,重试请求读取并复用同一操作标识
2、下面的 Python 函数被多次调用后,默认列表会保留此前加入的元素。最合适的改法是哪项?
def add_item(item, items=[]): items.append(item)return items{{ select(2) }}
在模块导入时调用一次垃圾回收,即可清空默认参数里的内容 把默认值改成 None,并在函数体内再创建新列表只把形参改成别的名字,默认对象就会按每次调用重新分配 每次返回前把列表转成字符串再转回列表,即可切断与默认对象的关联
3、一个交互线程和一个批处理线程同时处于可运行状态。系统希望交互线程响应更快,但又不能让批处理线程长期得不到执行。下列哪项调度调整最合适?{{ select(3) }}
始终把交互线程固定为最高优先级,并且不允许抢占 让每个线程独占处理器,直到它主动退出或运行结束 只按线程创建时间排序,并一直运行最早创建者 采用带时间片和优先级老化的多级反馈队列
4、若 asyncio 服务在协程中直接调用耗时的同步文件处理函数,期间其他请求也停止响应。最合适的调整是哪项?{{ select(4) }}
将阻塞的同步调用放到线程执行器中运行,并在协程里等待其结果 删除全部 await,让事件循环一次执行完整个请求继续直接调用同步函数,只把入口函数声明为 async成倍增加协程数量,让更多协程同时阻塞在同一个事件循环上
5、日志显示:Agent 已成功预占库存;配送创建因地址非法而不可重试;随后调用库存释放补偿时发生超时,当前无法确认释放是否生效。此时最准确的工作流状态是哪项?{{ select(5) }}
流程已经成功结束,配送稍后再补建 配送仍在重试中,库存继续保留 补偿处理中,库存释放结果未知 流程已经失败结束,库存确定已经释放
6、下面的函数使用半开区间,在升序数组中返回第一个大于等于 target 的位置;若不存在则返回 a.size():
int lowerBound(const vector<int>& a, int target) { int left = 0, right = a.size();while (left < right) { int mid = left + (right - left) / 2;if (a[mid] < target) /* 填空 */;else right = mid; }return left;}{{ select(6) }}
left = mid right = mid - 1 right = mid + 1 left = mid + 1
7、一个接口使用 Pydantic 模型接收用户配置,其中重试次数必须在 0 到 5 之间,模式只能取预定义值。哪种做法更合适?{{ select(7) }}
只在前端限制输入,服务端模型接受任何字符串和整数 把所有字段都声明成任意对象,进入业务函数后再猜测其含义 在模型字段中声明范围和枚举约束,让校验失败返回明确错误 校验失败时静默改成随机合法值,并继续执行后续业务
8、一个基于 TCP 的服务连续发送多条业务消息,接收端偶尔一次读到半条消息,也可能一次读到两条消息。最合适的处理方式是哪项?{{ select(8) }}
假设每次读取都对应一次发送,并直接按读取次数分包 关闭 TCP 的重传机制,使每次发送保持独立的数据边界 把接收缓冲区设为单条消息大小,即可固定读取边界 在应用层增加长度字段,并按长度循环组装完整消息
9、一个持续接收整数的数据流需要随时返回中位数,插入次数远多于查询次数,且不能在每次查询前重新排序。以下哪种数据结构组合更合适?{{ select(9) }}
一个普通队列保存全部数据,并在队头维护当前中位数 一个哈希集合保存不同整数,并用集合大小推导中位数 一个大顶堆保存较小的一半,一个小顶堆保存较大的一半 一个数组按到达顺序保存数据,查询时再执行完整排序
10、某 Python 程序需要对大量独立图像执行纯 CPU 计算。改用更多线程后,单进程吞吐几乎没有提升,CPU 也未充分利用多核。最合适的调整是哪项?{{ select(10) }}
把所有任务放入同一个协程,依靠 await提升 CPU 并行度继续增加线程数量,纯 Python 计算最终会自动绕过解释器限制 在每次计算前主动休眠,使操作系统更容易并行执行当前线程 使用多进程分配独立任务,并控制序列化与进程数量
11、订单表需要记录订单、用户和商品明细。为避免同一订单重复保存用户姓名,也避免一个订单只能存一件商品,以下哪组建表语句更符合关系模型的规范化设计?{{ select(11) }}
分别建立用户表、订单表和订单明细表,并用外键关联 建立一张订单表,把用户名和全部商品编号保存为逗号分隔文本 订单表重复保存用户全部字段,并为每件商品复制一行订单数据 每件商品建立一张独立订单表,并在表名中写入商品编号
12、非递减有序数组(长度大于 1)可能包含重复值,下面的双指针代码用于判断是否存在两个不同位置的元素之和等于 target:
int left = 0, right = a.size() - 1;while (left < right) { long long sum = 1LL * a[left] + a[right];if (sum == target) returntrue;if (sum < target) ++left;else --right;}returnfalse;{{ select(12) }}
把循环条件改成 left <= right后,仍能保证不会使用同一位置存在重复值时必须先去重,否则一定会漏掉正确答案 使用 left < right能避免同一位置被重复使用
13、一个 Python 异步服务并发请求多个外部接口。高峰期部分接口超时,未完成任务不断累积,关闭服务时仍有大量协程悬挂。最合适的调整是哪项?{{ select(13) }}
移除所有超时,让每个协程无限等待外部接口最终返回 只增加事件循环中的任务数量,不限制下游连接和请求速率 为外部调用设置超时,并在请求结束时取消不再需要的任务 用信号量限制并发后吞掉取消异常,不再向外传播
2.多选题
14、一个构建系统需要根据模块依赖关系确定编译顺序,并在依赖成环时终止构建。关于实现方式,以下哪些说法正确?(错选不得分,少选得 1/3 分){{ multiselect(14) }}
拓扑排序结束后仍有节点未输出,可据此判断存在环 将有向边改成无向边后做广度优先搜索,也能得到依赖顺序 可用有向图表示依赖,并通过拓扑排序生成可行顺序 只要按模块名称排序,就能保证所有依赖项先被编译
15、一个对外 HTTP 接口通过反向代理转发到内部服务。为了降低请求伪造和敏感信息泄露风险,以下哪些措施合理?(错选不得分,少选得 1/3 分){{ multiselect(15) }}
对外使用 TLS,并避免把令牌和敏感字段写入普通访问日志 将所有跨域来源设为允许,同时携带用户凭据以减少配置成本 由代理覆盖外部身份头,再向内部服务传递可信用户身份 在服务端校验身份、权限及关键业务参数,而不只依赖前端
16、处理一批可能含缺失字段的字典数据时,以下哪些做法合理?(错选不得分,少选得 1/3 分){{ multiselect(16) }}
读取可选字段时使用显式默认值,并区分缺失与合法零值 假设外部数据结构永远稳定,直接连续访问所有嵌套键 在进入核心计算前统一完成类型转换和字段校验 记录失败行和具体原因,使异常数据可以定位和补偿
17、非递减有序数组(长度大于 1)可能包含重复值,下面的双指针代码用于判断是否存在两个不同位置的元素之和等于 target。关于该实现,以下哪些说法正确?(错选不得分,少选得 1/3 分)
int left = 0, right = a.size() - 1;while (left < right) { long long sum = 1LL * a[left] + a[right];if (sum == target) returntrue;if (sum < target) ++left;else --right;}returnfalse;{{ multiselect(17) }}
数组有序时,依据当前和的大小移动一侧指针是成立的 存在重复值时必须先去重,否则一定会漏掉正确答案 使用 left < right能避免同一位置被重复使用该算法要求数组严格递增,出现相等元素就会进入死循环
18、订单表包含订单 ID、用户、状态、创建时间和金额。业务既要查询每位用户最近 30 天的最新一笔已支付订单,也要评估查询性能及并发一致性。关于实现与设计,哪些判断正确?(错选不得分,少选得 1/3 分){{ multiselect(18) }}
在读已提交隔离级别下,事务开始时会固定查询快照,后续语句继续读取该快照 应结合筛选条件、数据分布和执行计划判断索引是否生效,不能只凭 SQL 中出现的列推断 先筛选时间和支付状态,再按用户分区,并按创建时间、订单 ID 降序计算 ROW_NUMBER,保留序号为 1 的记录若订单与支付分别存为两个文档,依靠单文档原子更新即可维护两者的一致性
19、一个 RAG Agent 的上下文经常超过模型窗口,且回答中会引用低相关片段。以下哪些调整合理?(错选不得分,少选得 1/3 分){{ multiselect(19) }}
只提高生成温度,让模型自行忽略无关片段和窗口限制 按相关性和信息增益筛选片段,并限制单次注入的总长度 把召回到的所有片段完整拼接,窗口不足时再随机删除一半 保留必要的任务指令与近期对话,对较早内容做摘要或裁剪
题解
一、单选题
1
答案:B
单次下单最长可能 2 分钟,30 秒过期的缓存键会在请求未完成时失效,重试会被当成新请求再次创建,从而重复下单。行锁等待同一结果、唯一约束事务、持久化处理中记录都能让重试读到同一笔订单,并不是“缓存过期即可放行”。
2
答案:B
可变对象作为默认参数只在定义时创建一次,多次调用会共享同一列表。默认改成 None 并在函数内新建列表,可避免累积。改形参名、导入时做垃圾回收、返回前把列表转成字符串再转回来,都不能切断与默认对象的共享。
3
答案:D
多级反馈队列用时间片保证轮转,用优先级让交互更灵敏,再用老化避免批处理饿死。固定最高优先级且禁止抢占、独占运行到退出、按创建时间一直跑最早者,都会让另一方长期得不到执行。
4
答案:A
同步阻塞会卡住事件循环,其他协程也无法推进。应把阻塞调用放到线程执行器并在协程中等待。删掉全部 await、只把入口标成 async、单纯增加协程数量,都会让阻塞继续占住循环。
5
答案:C
配送已因不可重试原因失败,库存释放补偿又超时,只能判定补偿仍在处理且释放结果未知。不是配送还在重试,也不是流程已成功结束或库存已确定释放。
6
答案:D
半开区间 [left, right) 中,a[mid] < target 时应丢掉中点及左侧,令 left = mid + 1。left = mid 可能不收缩区间;改动 right 会破坏“右端是答案上界”的不变量。
7
答案:C
取值范围和枚举应写在模型字段上,校验失败返回明确错误。只靠前端限制、把字段声明成任意对象、失败后静默改成随机合法值,都会让非法配置进入业务。
8
答案:D
TCP 是字节流,一次读取可能半包或粘包,必须在应用层用长度字段按长度组装。按读取次数分包、关掉重传、把缓冲区设成“刚好一条”,都不能固定消息边界。
9
答案:C
对顶堆把较小一半放在大顶堆、较大一半放在小顶堆,插入时可维护中位数,查询不必全量排序。按到达顺序再排序、哈希去重后用集合大小推中位数、在队头“维护中位数”,都不满足插入远多于查询且禁止每次重排的约束。
10
答案:D
纯 Python CPU 计算受 GIL 限制,加线程几乎吃不满多核。应改用多进程分发独立任务,并控制序列化与进程数。塞进同一协程靠 await、继续加线程、计算前休眠,都不能绕开解释器锁。
11
答案:A
用户、订单、订单明细分表并用外键关联,可避免用户字段重复,也支持一单多商品。逗号分隔文本、订单行复制用户字段、按商品名各建一张表,都不符合规范化。
12
答案:C
left < right 保证两个下标不同,不会把同一位置加两次。有序数组上该算法允许重复值,不必先去重;改成 left <= right 会在 left == right 时使用同一位置。
13
答案:C
下游超时且关闭时协程悬挂,应给外部调用加超时,并在请求结束时取消不再需要的任务。去掉超时、只加任务数、吞掉取消异常,都会让悬挂任务继续堆积。
二、多选题
14
答案:A、C
环检测与有向图拓扑排序描述正确。B 错:改成无向边再 BFS 会丢掉依赖方向。D 错:按模块名称排序不能保证依赖项先编译。
15
答案:A、C、D
对外 TLS 与日志脱敏、代理覆盖外部身份头、服务端校验身份权限与业务参数,都是合理防护。B 错:允许全部跨域来源并携带凭据,会放大伪造请求和凭据泄露风险。
16
答案:A、C、D
可选字段给显式默认值并区分缺失与合法零、计算前统一校验、记录失败行原因,都便于处理脏数据。B 错:假定嵌套结构永不变化并直接链式取值,缺字段时难以定位和补偿。
17
答案:A、C
有序时按当前和移动一侧指针、以及 left < right 避免同一位置,描述正确。B 错:存在重复值不必先去重,否则才会漏解的说法不成立。D 错:相等元素不会让该循环死循环,也不要求数组严格递增。
18
答案:B、C
结合过滤条件、数据分布和执行计划判断索引,以及按时间与支付状态过滤后再按用户取最新一笔,描述正确。A 错:读已提交并不会在事务开始时钉死快照。D 错:订单与支付分成两个文档时,单文档原子更新不能保证二者一致。
19
答案:B、D
按相关性与信息增益筛选并限制注入长度,以及保留必要指令和近期对话、对更早内容做摘要或裁剪,描述正确。A 错:只提高温度不能让模型自行突破窗口限制。C 错:全量拼接再随机删一半,既浪费窗口也留不住高相关片段。

夜雨聆风