SDE / AS / Intern · Coding

Amazon OOD Coding:对象上下左右移动,返回最终坐标

显式方向映射与坐标合同,说明批次验证、非法指令和可交换移动的边界。

题目重点:显式方向映射与坐标合同,说明批次验证、非法指令和可交换移动的边界。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练无界二维整数平面,右+x,上+y,每步长度1;指令数组只接受上/下/左/右。
  • Position多次调用延续状态;非法命令raise且整个批次不修改位置。文本逗号解析不是本API职责。

解题路线

  1. 把指令映射为(dx,dy),先将整批解析成合法moves,再累加到对象x,y。简单需求不需要每个方向建子类或设计地图导航。
  2. 无界且无障碍时向量相加满足交换律,只求最终位置可统计四方向次数。若要沿途碰撞、路径或步数限制,顺序不能被压掉。
  3. 训练先验证整个批次才能保证遇非法命令没有半截状态;若输入巨大流,不保留全部moves,则须选择单步提交或先算局部delta并在成功后提交。
  4. 并发apply需原子读改写,锁覆盖x/y共同更新与返回快照;同批重试会再移动,若生产要求幂等,需要请求id,而非仅比新旧坐标。

手动走一遍

题目例指令上、下、下、左、右、左得到(-1,-1)。若第二批包含未知“跳”,训练对象应保持上一坐标不变。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

class Position:
    """Unbounded integer plane; up increases y, right increases x."""
    MOVES={'上':(0,1),'下':(0,-1),'左':(-1,0),'右':(1,0)}

    def __init__(self):
        self.x=self.y=0

    def apply(self,commands):
        moves=[self.MOVES[command] for command in commands]
        self.x+=sum(dx for dx,dy in moves)
        self.y+=sum(dy for dx,dy in moves)
        return self.x,self.y

复杂度

当前示例O(n)时间与O(n)moves临时空间;只累计局部delta可在批次成功后一次提交并降O(1)空间。不返回沿途坐标。

易错点与追问

容易失分的边界

  • 默认屏幕坐标上+y却未声明。
  • 非法命令前已修改部分位置。
  • 有障碍仍把命令无序统计。

继续深挖

  • 要记录路径怎样改变输出下界?
  • 重复请求如何幂等?
  • 有地图边界遇越界是拒绝还是停止?
✓已复制微信号!