#P5249. 第1题-选择题
-
Tried: 3
Accepted: 0
Difficulty: 5
所属公司 :
阿里
时间 :2026年8月15日-阿里巴巴工程岗
第1题-选择题
答案+解析
一、单选题
1
答案:B
单次下单最长可能 2 分钟,30 秒过期的缓存键会在请求未完成时失效,重试会被当成新请求再次创建,从而重复下单。行锁等待同一结果、唯一约束事务、持久化处理中记录都能让重试读到同一笔订单,并不是“缓存过期即可放行”。
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) return true;
if (sum < target) ++left;
else --right;
}
return false;
{{ 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) return true;
if (sum < target) ++left;
else --right;
}
return false;
{{ multiselect(17) }}
- 数组有序时,依据当前和的大小移动一侧指针是成立的
- 存在重复值时必须先去重,否则一定会漏掉正确答案
- 使用
left < right能避免同一位置被重复使用 - 该算法要求数组严格递增,出现相等元素就会进入死循环
18、订单表包含订单 ID、用户、状态、创建时间和金额。业务既要查询每位用户最近 30 天的最新一笔已支付订单,也要评估查询性能及并发一致性。关于实现与设计,哪些判断正确?(错选不得分,少选得 1/3 分) {{ multiselect(18) }}
- 在读已提交隔离级别下,事务开始时会固定查询快照,后续语句继续读取该快照
- 应结合筛选条件、数据分布和执行计划判断索引是否生效,不能只凭 SQL 中出现的列推断
- 先筛选时间和支付状态,再按用户分区,并按创建时间、订单 ID 降序计算
ROW_NUMBER,保留序号为 1 的记录 - 若订单与支付分别存为两个文档,依靠单文档原子更新即可维护两者的一致性
19、一个 RAG Agent 的上下文经常超过模型窗口,且回答中会引用低相关片段。以下哪些调整合理?(错选不得分,少选得 1/3 分) {{ multiselect(19) }}
- 只提高生成温度,让模型自行忽略无关片段和窗口限制
- 按相关性和信息增益筛选片段,并限制单次注入的总长度
- 把召回到的所有片段完整拼接,窗口不足时再随机删除一半
- 保留必要的任务指令与近期对话,对较早内容做摘要或裁剪