组里有个 35岁的老员工,技术一般,干了7年,月薪 16k,上周领导找我说,要把他转岗到测试组,不同意就优化掉~
刚看到个贴子,说组里一个35岁的老员工,干了7年,16k,技术一般,被领导通知要么转去测试降薪,要么被优化。他一说起两个上学的娃、没工作的老婆、还有15年房贷,确实挺扎心的。
这只是贴子的情况哈;真发网上,评论区估计一半在骂公司无情,一半会说“技术一般还不焦虑,早该提升自己”。我倒觉得,这事没那么简单粗暴地说谁对谁错。现实就是:公司只看性价比,不看眼缘,也不看眼泪。
从我的角度看,他现在能做的,第一先保住现金流,转岗未必是坏事,比直接失业强;第二,别再沉迷“稳定”的幻觉,立刻补课,学新技能,想办法让自己以后不只值16k。
职场谁都不容易,别指望别人心软,能救你的,只有你自己变得更有价值。
算法题:逃脱阻碍者
先来想象个画面哈:你站在原点 (0,0),前面某个格子上放着奶茶,也就是目标点 target。地图上还散落着几个阻碍者(官方叫 ghost),他们可以往任意方向走一步,速度跟你一模一样。问题就一句话——你能不能在他们追上你之前,把奶茶抢到手?
题目大概长这样(伪代码意思一下):
你:起点固定在 (0,0) 目标:在坐标 (tx, ty) 阻碍者:若干个点 (gx, gy) 你和他们都只能走「上下左右」一步,走一步时间一样 只要有一个阻碍者在你到达目标之前或同时到达目标,你就算失败 否则你就成功“逃脱阻碍者”
很多人(包括我第一次看到)脑子里第一反应是:这不是典型迷宫找路吗,写个 BFS / A* 搜一下路径不就完了?但仔细一想,地图是无限大的,阻碍者又可以乱跑,你根本没法枚举所有走法。好消息是,这题其实可以被一句话秒杀。
把问题“压扁”成距离比较
先说一个关键观察: 这种只能上下左右移动、每一步花费相同时间的地图,用的不是欧几里得距离,而是曼哈顿距离:
[ dist((x1,y1),(x2,y2)) = |x1 - x2| + |y1 - y2| ]
你不管怎么绕,只要不往回走,最快到达某个点的时间一定就是这俩点的曼哈顿距离。比如从 (0,0) 到 (2,3),最快也就 5 步,要么一路往右再一路往上,要么各种交叉走,但总步数不会少于 5。
那你和阻碍者的“最强实力”其实就两件事:
你能以 dist((0,0), target)这么多步跑到目标每个阻碍者能以 dist(ghost_i, target)这么多步冲到目标
接下来就简单了: 如果有任何一个阻碍者,跑到目标的最短步数 ≤ 你跑到目标的最短步数,那就完蛋了——它完全可以直奔目标,蹲在那等你,最差也是跟你同一拍到达,规则说这是你输。
反过来,如果所有阻碍者到目标的最短距离都比你大,那他们无论怎么绕路,都不可能比你更早到或同时到。你只要沿着任意一条最短路径慢慢走,肯定先到。
所以整道题就一句判断:
如果 ∃ ghost s.t.
dist(ghost, target) <= dist((0,0), target)-> 返回 False 否则 -> 返回 True
完全不用管“它们会不会半路拦截你”这种脑洞,因为半路拦截本质上也要走步数,只要它到目标都比你慢,那它想拦你就更不可能了。
用 Python 写一下
按题目要求用 Python 写个函数,名字就叫 escapeGhosts,入参一个 ghosts 列表和 target 坐标。
from typing import List
classSolution:
defescapeGhosts(self, ghosts: List[List[int]], target: List[int]) -> bool:
# 你从 (0,0) 到 target 的最短步数:曼哈顿距离
my_dist = abs(target[0]) + abs(target[1])
# 遍历每一个阻碍者
for gx, gy in ghosts:
ghost_dist = abs(gx - target[0]) + abs(gy - target[1])
# 只要有一个鬼到目标的最短距离 <= 你,就逃不掉
if ghost_dist <= my_dist:
returnFalse
# 所有鬼都比你远,稳了
returnTrue
调用示例随便举个:
s = Solution()
# 例1:两个阻碍者,一个在 (1,0),一个在 (2,2),目标在 (3,1)
ghosts = [[1, 0], [2, 2]]
target = [3, 1]
print(s.escapeGhosts(ghosts, target)) # 可能是 False,要看算出来的距离
# 例2:没有阻碍者,当然能到
ghosts = []
target = [100, 100]
print(s.escapeGhosts(ghosts, target)) # True
复杂度也很干净:有 n 个阻碍者,每个就算一下绝对值和,时间复杂度 O(n),空间 O(1),在算法题里属于非常友好的难度。
顺手提几件实战里容易犯错的点:
有人会写成欧几里得距离 sqrt(dx*dx + dy*dy),这个在棋盘四方向走是不对的,一定要用曼哈顿。起点是固定在 (0,0),很多人不看题就写成“玩家起点给一个参数”,也能做,但就跟题面不符了。 注意条件是“阻碍者到目标的最短步数 ≤ 你”,等于也算你输,不要写成 <。
这类题其实很适合训练一个思维: 看到坐标就想“是不是可以直接用数学公式搞定”,不要上来就 BFS / DFS / Dijkstra 一顿乱敲,很多时候都有这种“压缩到一维”的巧解。
这次讲的和之前那些数据库性能、MQ 场景、TCP 抓包排查之类的工程故事完全不是一类东西,就不扯远了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB