目录
正在加载目录...

Amazon SDE OA 7月新鲜面经|第二题 AI Coding,一次 AC 全记录

刚做完 Amazon SDE OA 来记录一下,这次的形式和之前不太一样,第二题不是传统算法题,是给你一个现成的项目让你修功能,感觉亚麻也开始跟进AI coding这个方向了。

整场90分钟,时间分配上我第一题花了大概35分钟,剩下的时间都留给了第二题。个人感觉这种新题型对纯刷题选手不太友好,但如果平时有实际项目经验、习惯读别人代码的话,反而比硬核算法题好拿分。下面把两道题的思路都详细写一下,给后面排队考的同学参考。

Amazon SDE OA 7月新鲜面经|第二题 AI Coding,一次 AC 全记录

AI Coding 题是什么

简单说,就是给你一个能跑的完整项目(我这次是 Django 后端),让你在真实的文件树里修 bug、加功能,最后用 pytest 判分。和传统题最大的区别有三点:以前是空白函数从零写,现在是几十个文件的现成代码,主要考你会不会快速读懂;判分不管代码漂不漂亮,只看测试能不能全绿;环境是真 IDE,可以边写边跑测试,想了解官方口径的可以看 亚麻 SDE OA 准备页

Amazon SDE OA 形式

亚麻自家的在线平台,S1、S2 两个 section 各一题,总时长充裕(我做完第一题时还剩 28 分钟,第二题剩 46 分钟起步)。第一题是传统的函数补全加 test case 判分;第二题是完整项目环境——左侧文件树、多文件编辑、右侧 Run Tests 实时跑测试,体验接近在真实 IDE 里干活。

第一题:网格配送中心(Coding)

题意大概是:一个0/1网格,1代表已有的配送中心,距离定义是切比雪夫距离,也就是max(|dx|, |dy|)。你最多可以把一个0变成1,目标是让所有格子到最近的1的最大距离最小化,返回这个最小值。

Amazon SDE OA 7月新鲜面经|第二题 AI Coding,一次 AC 全记录

我的思路:

首先跑一遍多源 BFS,把所有初始的 1 同时入队,计算出每个格子到最近配送中心的距离。由于距离定义是切比雪夫距离,BFS 需要往八个方向扩展,也可以直接用 DP 进行两遍扫描得到距离矩阵。

答案具有单调性,如果距离 d 可行,那么 d+1 一定也可行,因此可以对答案进行二分查找。在 check 函数中,先找出所有当前距离大于 mid 的格子,这些格子必须被新添加的 1 覆盖。新 1 的覆盖范围是以它为中心、边长 2*mid+1 的正方形,所以问题转化为这些“不达标”格子的覆盖正方形是否有公共交集,且交集内存在一个可以放置 1 的格子。只需维护这些格子 x、y 坐标的最大最小值,判断交集是否非空即可。

切比雪夫距离的好处在于覆盖范围是正方形,交集判断特别干净,不需要像欧氏距离那样处理圆形区域。整体复杂度 O(nm log(max(n,m))),代码写起来不算长,但二分查找的 check 函数需要想清楚边界情况。

第二题:修复周期转账功能(AI Coding)

给了一个Django项目,钱包转账相关的功能是坏的,要求修好并且支持创建周期性扣款、参数校验、按周期执行扣款这些。

Amazon SDE OA 7月新鲜面经|第二题 AI Coding,一次 AC 全记录

我的思路:

这题主要是修复周期转账的功能。我在 serializer 里加了创建时的校验:start_date 不能晚于 end_date,金额必须大于 0,sender 和 receiver 不能是同一个钱包,不满足就直接 raise ValidationError。

执行扣款时,先判断 payment 是否 active 以及有没有到期(用当前日期和 last_payment_date 按 frequency 算下一次扣款时间),再检查 sender 余额是否足够。

最容易漏的一步是扣款成功后一定要更新 last_payment_date,不然同一个周期会重复扣款,有个 test case 专门卡这个。转账操作建议放在事务里,保证扣 sender 加 receiver 是原子性的。

这种题比算法题更考验读代码的能力,项目文件不少,建议先看 README 和 failing tests,从失败用例反推要改哪里,比自己从头读 models 快很多。

写在最后

总体感觉这次OA难度适中,第一题想到二分+交集判断就不难,第二题主要是细心。近期亚麻 OA、VO 的节奏都很密,我备考时跟的 InterviewShow 已经把 AI coding 题型收进了亚麻专题,项目环境题有对应的练习库,VO 之前也能约 mock 提前适应追问节奏。他家最近上岸的案例不少,收到 OA 邮件心里没底的可以先去聊聊。

END