
最近刚做完亚麻的 Amazon Intern OA ,趁热打铁来一波复盘,希望能帮到大家。Amazon OA共两部分: Part 1 是Work Simulation(情境判断)。
参考原则: 1. Requirement > Deadline 面对任务冲突/优先级选择时,始终以客户/业务需求为最高优先,其次才是时间节点。 2. Manager优先选择 选项中出现Manager的内容优先考虑。Manager是团队的代言人和保护伞,代表团队意图,也是处理冲突最可靠的角色。
题型简析: 主要是行为情境判断题(类似SJT),需要你在多个选项中选择“最有效”和“最不有效”的做法。 涉及:任务分配冲突、组间沟通、需求变更响应、客户反馈处理等职场情境。 注意:不能太理想主义,亚麻偏务实和执行导向,答题逻辑一定要符合”customer obsession”和”bias for action”。
Part 2 是Coding Challenge(Hackerrank编程) ,时间分配建议:70分钟两题 还有其他最近考过的高频题&参考思路,我整理了一下一共26页,需要的可以联系我。
Amazon Intern OA
第一套题目
Q1题目:给定 n 个机器人,每个机器人都有一个阈值 coordinationThreshold[i],表示它想要正常进入 Operating 状态,至少需要有多少个其他机器人也处于 Operating 状态。你需要给每个机器人分配状态,要么是 Operating,要么是 Standby,并且要满足下面两个条件:
- 如果一个机器人被分到 Operating,那它看到的其他 Operating 机器人数量必须大于等于它的阈值。
- 如果一个机器人被分到 Standby,那它看到的其他 Operating 机器人数量必须严格小于它的阈值。
只要有任意一个机器人不满足对应条件,整个系统就算不稳定。
解题思路:
- 假设最终有k 个机器人是 Operating,那么所有阈值
<= k-1的机器人必须都能进 Operating,否则凑不够 k 个。 - 如果某个机器人的阈值刚好是
k,它无论选 Operating 还是 Standby 都会出错,所以这种 k 必须排除。 - 所以我们统计每个阈值出现次数
freq,并用前缀和算出cnt = 阈值 <= k-1 的机器人数量。 - 当且仅当
cnt == k且freq[k] == 0,这个 k 是一个合法配置,答案加 1。
代码
def getValidConfigurations(coordinationThreshold):
n = len(coordinationThreshold)
freq = [0] * (n + 1)
for t in coordinationThreshold:
freq[t] += 1
ans = 0
cnt = 0
for k in range(n + 1):
if k > 0:
cnt += freq[k - 1]
if cnt == k and freq[k] == 0:
ans += 1
return ansQ2题目:题目给了一个初始网格,大小是 p1 × q1,一开始所有格子都是空的。之后每一步只能做两种操作中的一种:要么在最上面加一整行,要么在最右边加一整列;而且每次新加的这一行或这一列里,必须恰好选一个格子放物品,其他新格子都还是空的。
重复若干次之后,网格会扩展到 p2 × q2。问题是,最后一共能得到多少种不同的填充结果,也就是哪些黑白分布是可能通过这种方式一步步构造出来的,答案需要取模。
解题思路:
- 先把问题转成“新增了多少行 r 和多少列 c”,然后用动态规划按“逐行扩展”来统计方案数。
dp[new_c]表示处理到当前阶段时,已经新增了new_c列的所有合法填法数量。- 每次新增一行时,有两类转移:要么在当前已有列里选位置放(乘当前列数),要么结合之前的状态和前缀累积
s处理“新增列带来的贡献”。 - 最后再把剩余列扩展的影响一次性乘上(用幂数组
p),把所有new_c的结果加起来并取模。
代码
def findAllocationWays(p1, q1, p2, q2):
MOD = 998244353
r = p2 - p1
c = q2 - q1
dp = [0] * (c + 1)
dp[0] = 1
for new_r in range(r):
base = (p1 + new_r) % MOD
nxt = [0] * (c + 1)
s = 0
for new_c in range(c + 1):
nxt[new_c] = (nxt[new_c] + dp[new_c] * ((q1 + new_c) % MOD)) % MOD
if new_c >= 1:
s = (base * (s + dp[new_c - 1])) % MOD
nxt[new_c] = (nxt[new_c] + s) % MOD
dp = nxt
b = (p1 + r) % MOD
p = [1] * (c + 1)
for i in range(1, c + 1):
p[i] = (p[i - 1] * b) % MOD
ans = 0
for new_c in range(c + 1):
ans = (ans + dp[new_c] * p[c - new_c]) % MOD
return ans第二套题目
Q1题目:给你一个整数数组。每次操作时,你可以选一个前缀,让这个前缀里的所有元素同时加 1 或减 1。目标是用最少的操作次数,把整个数组最后都变成 0。
解题思路:使用贪心,从列表末尾开始,依次调整每个元素使其平衡。累加所有调整的步数,得到最小操作次数
代码
def getMinimumOperations(cart):
ans = 0
c = 0
for item in reversed(cart):
adj = -item - c
ans += abs(adj)
c += adj
return ansQ2题目:给定一个字符串,要求找出一个最长的子串,但这个子串不能等于整个字符串本身。条件是:子串里出现过的每个字符,在子串外面都不能再出现。换句话说,一个字符要么完全落在这个子串里面,要么完全不在里面,不能同时出现在子串内外两边。
如果存在这样的子串,就返回它的最大长度;如果不存在,就返回 0。
解题思路:首先记录每个字母在字符串中的首次和最后一次出现位置,然后收集所有这些边界点并排序。接着,通过前缀和数组快速统计子串中各字母的出现次数,并验证子串内所有字母的首次和最后一次出现都在子串范围内。最终,遍历所有可能的边界组合,找到满足条件的最长子串长度
代码
def findLongestLength(fullString):
n = len(fullString)
if n <= 1:
return 0
firOcc = [-1] * 26
lastOcc = [-1] * 26
for i, ch in enumerate(fullString):
idx = ord(ch) - ord('a')
if firOcc[idx] == -1:
firOcc[idx] = i
lastOcc[idx] = i
intervals = []
bdSet = set()
for c in range(26):
if firOcc[c] != -1:
intervals.append((firOcc[c], lastOcc[c]))
bdSet.add(firOcc[c])
bdSet.add(lastOcc[c])
if not intervals:
return 0
bdList = sorted(bdSet)
pre = [[0] * 26 for _ in range(n + 1)]
for i in range(n):
for c in range(26):
pre[i + 1][c] = pre[i][c]
idx = ord(fullString[i]) - ord('a')
pre[i + 1][idx] += 1
ans = 0
for i in range(len(bdList)):
for j in range(i, len(bdList)):
start = bdList[i]
end = bdList[j]
if (start == 0 and end == n - 1) or start > end:
continue
length = end - start + 1
isValid = True
for c in range(26):
count = pre[end + 1][c] - pre[start][c]
if count > 0:
if firOcc[c] < start or lastOcc[c] > end:
isValid = False
break
if isValid and length > ans:
ans = length
return ans整体Amazon OA下来,反馈还是很不错的,隔天就收到follow up邮件,有oa vo都可以来问,各个公司都比较经验。求职辅导服务是时间和质量的权衡。咨询interview Aid,获取最专业的科技求职辅导。