题目重点:显式方向映射与坐标合同,说明批次验证、非法指令和可交换移动的边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练无界二维整数平面,右+x,上+y,每步长度1;指令数组只接受上/下/左/右。
- Position多次调用延续状态;非法命令raise且整个批次不修改位置。文本逗号解析不是本API职责。
解题路线
- 把指令映射为(dx,dy),先将整批解析成合法moves,再累加到对象x,y。简单需求不需要每个方向建子类或设计地图导航。
- 无界且无障碍时向量相加满足交换律,只求最终位置可统计四方向次数。若要沿途碰撞、路径或步数限制,顺序不能被压掉。
- 训练先验证整个批次才能保证遇非法命令没有半截状态;若输入巨大流,不保留全部moves,则须选择单步提交或先算局部delta并在成功后提交。
- 并发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却未声明。
- 非法命令前已修改部分位置。
- 有障碍仍把命令无序统计。
继续深挖
- 要记录路径怎样改变输出下界?
- 重复请求如何幂等?
- 有地图边界遇越界是拒绝还是停止?
