目录
正在加载目录...

Amazon Intern OA | Amazon OA 一亩三分地

Amazon Intern OA | Amazon OA 一亩三分地

最近刚做完亚麻的 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 机器人数量必须严格小于它的阈值。

只要有任意一个机器人不满足对应条件,整个系统就算不稳定。

解题思路:

  1. 假设最终有k 个机器人是 Operating,那么所有阈值 <= k-1 的机器人必须都能进 Operating,否则凑不够 k 个。
  2. 如果某个机器人的阈值刚好是 k,它无论选 Operating 还是 Standby 都会出错,所以这种 k 必须排除。
  3. 所以我们统计每个阈值出现次数 freq,并用前缀和算出 cnt = 阈值 <= k-1 的机器人数量
  4. 当且仅当 cnt == kfreq[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 ans

Q2题目:题目给了一个初始网格,大小是 p1 × q1,一开始所有格子都是空的。之后每一步只能做两种操作中的一种:要么在最上面加一整行,要么在最右边加一整列;而且每次新加的这一行或这一列里,必须恰好选一个格子放物品,其他新格子都还是空的。

重复若干次之后,网格会扩展到 p2 × q2。问题是,最后一共能得到多少种不同的填充结果,也就是哪些黑白分布是可能通过这种方式一步步构造出来的,答案需要取模。

解题思路:

  1. 先把问题转成“新增了多少行 r 和多少列 c”,然后用动态规划按“逐行扩展”来统计方案数。
  2. dp[new_c] 表示处理到当前阶段时,已经新增了 new_c 列的所有合法填法数量。
  3. 每次新增一行时,有两类转移:要么在当前已有列里选位置放(乘当前列数),要么结合之前的状态和前缀累积 s 处理“新增列带来的贡献”。
  4. 最后再把剩余列扩展的影响一次性乘上(用幂数组 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 ans

Q2题目:给定一个字符串,要求找出一个最长的子串,但这个子串不能等于整个字符串本身。条件是:子串里出现过的每个字符,在子串外面都不能再出现。换句话说,一个字符要么完全落在这个子串里面,要么完全不在里面,不能同时出现在子串内外两边。

如果存在这样的子串,就返回它的最大长度;如果不存在,就返回 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,获取最专业的科技求职辅导。

正文完