Python技术迷

30岁阿里P7,边缘团队很难晋升,看了看个人所得税去年税前总收入180+,这个收入算高算低呀

刚看到个贴子,说30岁阿里P7,在边缘团队晋升困难,一查个税记录,去年税前总收入180万+,开始纠结这收入算高算低。

Image

我觉得这事吧,先说结论:在全国范围,这收入已经是绝对塔尖了,但放在大厂圈子里,只能算“不错但不离谱”。网友的回复我看了,有的说“180还叫难”,有的说“高薪牢笼”,也有人劝早点润。我比较认同一句:别只拿身边的高手当参照系。你总跟年薪300、500的比,永远觉得自己不行,可放到普通职场里,你已经是别人望不到的水平了。

换个角度想,真正该焦虑的,不是“算高算低”,而是:这个收入能持续多久?身体能不能扛得住?技能是不是能带着你跳出边缘团队?

力

算法题:逃脱阻碍者

我那天晚上刷题刷到一点多,眼睛都花了,结果被一道名字挺中二的题卡住——「逃脱阻碍者」。 一开始看题目我还以为是塔防游戏,仔细一看,其实逻辑特别简单,但很考思维的转弯。

有这么个设定哈:

  • 你一开始站在原点 (0, 0)。
  • 地图上有一堆“阻碍者”,每个阻碍者一开始在一个固定的坐标上,比如 (1, 2)、(-3, 5) 这种。
  • 远处有一个安全点 target = [tx, ty],你要跑到那里就算成功逃脱。
  • 规则是:你和所有阻碍者每一回合都可以上下左右走一步(不能斜着走),速度一样快,你先动,然后他们一起动。
  • 只要有任意一个阻碍者在某一时刻跟你站在同一个格子上,你就凉了。
  • 问:有没有办法让你一定能逃到安全点?

题目要我们返回一个布尔值:能逃脱就 True,否则 False。

很多同学一开始会想:

是不是要算各种走法,什么往左绕一下、右边绕一下,看能不能骗过阻碍者?

其实不用想那么复杂,这题地图是无限大的,没有墙,没有障碍,大家速度都一样,每步走一格,> 所以你绕来绕去,本质上都是浪费时间。

对你来说,最优策略就是一条直线冲向终点(这里的直线是“曼哈顿距离”意义上的最短路径,而不是几何直线),只要你能比所有阻碍者更早到或者最少同一时刻到达安全点,而且中途不被追上,那就稳了。

那阻碍者怎么想? 它们也不傻呀,它们最阴间的玩法就是:直接去安全点蹲你。

  • 如果某个阻碍者比你更快或者一样快到达安全点,它完全可以提前或同时站在安全点上等你。
  • 你一旦到了安全点,位置重合,当场被抓。

所以整个问题就被压缩成一句话:

只要有一个阻碍者,到安全点的最短步数 小于等于 你到安全点的最短步数,你就必输。

反过来:

如果所有阻碍者到安全点的最短步数都 严格大于 你到安全点的最短步数,你一定能赢。

这就是整个算法的核心判断。

为什么是“最短步数”?曼哈顿距离来帮忙

因为大家每次只能上下左右走一步,所以从 (x1, y1) 走到 (x2, y2) 的最少步数就是:

|x1 - x2| + |y1 - y2|

这个就叫曼哈顿距离。

  • 你从 (0, 0) 到 target = (tx, ty):player_dist = abs(tx) + abs(ty)
  • 某个阻碍者从 (gx, gy) 到 target:ghost_dist = abs(gx - tx) + abs(gy - ty)

只要有一个 ghost_dist <= player_dist,你就不用想了,直接返回 False。 如果所有阻碍者都满足 ghost_dist > player_dist,那就返回 True。

这其实还有一个隐藏直觉: 在一个完全空旷的网格上,谁离目标更近,谁就一定可以“卡位”成功,因为大家速度一致,又没有加速技能。

用 Python 写一下

按照题目的一般形式,函数签名大概是这样:

from typing import List

classSolution:
defescapeGhosts(self, ghosts: List[List[int]], target: List[int]) -> bool:
# 你到目标点的曼哈顿距离
        tx, ty = target
        my_dist = abs(tx) + abs(ty)

# 遍历每一个阻碍者
for gx, gy in ghosts:
            ghost_dist = abs(gx - tx) + abs(gy - ty)
# 只要有一个阻碍者到目标点不比你慢,就说明你跑不过它
if ghost_dist <= my_dist:
returnFalse

# 所有阻碍者都比你慢,安全
returnTrue

可以随手测两组数据感受一下:

s = Solution()

# 示例1:你能赢
ghosts = [[1, 0], [2, 3]]
target = [3, 0]
print(s.escapeGhosts(ghosts, target))  # 可能是 True

# 示例2:你必输
ghosts = [[1, 0]]
target = [2, 0]
print(s.escapeGhosts(ghosts, target))  # False,因为鬼和你一样快到终点

第二个例子特别典型:

  • 你从 (0,0) 到 (2,0),距离是 2。
  • 阻碍者从 (1,0) 到 (2,0),距离是 1。 它肯定比你早到终点,蹲在那里,你一来就被抓。

整道题看上去像博弈、像路径规划,其实被“没有障碍 + 步长固定 + 速度一样”这几个条件大大简化了,变成了一个纯比距离的问题:

  1. 你到终点的曼哈顿距离算一下。
  2. 枚举一下所有阻碍者到终点的曼哈顿距离。
  3. 只要出现 ghost_dist <= my_dist 的,就判定逃不掉。
  4. 全部都大于的话,你就放心往终点冲,不用绕,也不用秀走位。

说白了,这题的难点不是代码,而是能不能把复杂场景脑补成一个简单数学条件。 这种题刷多了,再遇到类似“大家速度一样,地图又干净”的题,你大概率一眼就能想到用曼哈顿距离去比较了。

行,今天就先聊到这,我去给自己倒杯水,你有别的算法题想一起拆一拆可以继续丢给我。