
Adobe 的 OA 先看读题和边界,再看代码是否能跑通。计时开始后别急着把模板铺满:先写清输入约束,确认空数组、重复区间和边界相连时的结果。两道题里,一道是区间合并变体,另一道把二进制串的状态转移藏在操作顺序里。
第一题拿下后,留三分钟把样例改成边界样例再跑一遍,比立刻跳到第二题更值。HackerRank 页面里能看到的测试不多,函数返回值、索引和溢出才是最后容易丢分的地方。
第一题:带优先级的区间合并
题目描述
给出一批 [start, end, priority] 任务。时间重叠时,只保留优先级更高的任务片段;优先级相同则按输入顺序保留。输出按时间排序、彼此不重叠的片段列表。输入本身无序,且端点可以相等。
解题思路
先按 start、end 和输入序号排序。维护结果列表的最后一个片段,遇到重叠区间时把交集单独切出来比较优先级,再将左右剩余部分放回待处理序列。实现时不要原地修改正在遍历的列表;把切分后的片段放进临时数组,最后按起点合并相邻且属性相同的段。这样每一次重叠都能明确处理,不会把相接区间误当成交集。
复杂度:排序 O(n log n),切分后的片段数决定后续扫描成本。
第二题:禁止相邻 1 的二进制串计数
题目描述
给定长度 n 和若干被固定的下标,构造长度为 n 的二进制串。任意两个相邻位置不能同时为 1,固定位置必须遵守输入值。返回不同合法构造的数量,结果对给定模数取余。
解题思路
用两个状态记录当前位置结尾为 0 与为 1 的方案数。当前位置固定为 0 时,只更新 dp0 = old0 + old1;固定为 1 时,只能从 old0 转移;未固定时同时做两种转移。开始前先检查相邻固定 1,发现冲突直接返回零。代码里把模运算放在每次加法后,避免语言的整型范围把结果带偏。
复杂度:时间 O(n),空间 O(1)。
做题过程里该留意什么
- 区间题先写清端点语义。闭区间的
[2, 4]与[4, 6]是否冲突,决定比较符是<还是<=。 - DP 题把
n=1、全固定和首位固定为1单独跑一遍,能很快发现初始状态写反的问题。 - 写完函数后用一组乱序输入和一组全部相邻输入检查输出顺序;不要只用题面样例。
FAQ
Adobe OA 只有算法题吗?
岗位和批次不同会有变化。准备时把 HackerRank 的函数式输入、调试输出受限和运行时约束一起练,比只背题名更实用。
第二题为什么不用递归?
递归能表达状态,但线性 DP 更容易控制取模和固定位置。面试时先把两种结尾状态写出来,代码会短很多。
参考来源
- Adobe MTS-1 的 HackerRank 流程与编程环节
- Adobe Software Engineer Internship 的在线测试与技术面记录
- Adobe Software Engineer 候选人反馈
关于 CSINTERVIEWHELP
无论是 OA 题型解析、OA 辅导、VO 辅助、VO 模拟面试、VO 面试陪练还是系统设计辅助,CSINTERVIEWHELP 都提供按岗位定制的练习和反馈:查看服务。
