同学30岁,带着100万回湖南某县城,以为能轻松躺平。结果,想创业竞争大,想兼职压根就没有,最后居然跑去送外卖了
刚刷到个贴子,说一位前字节员工的同学,30岁带着100万回老家县城,想着能轻松躺平,结果创业卷不过,兼职也找不到,最后竟然跑去送外卖了。
我觉得这事吧,其实挺典型的。很多人以为有点存款就能“退隐江湖”,但现实社会像代码环境一样,永远有隐藏的 bug 和复杂的依赖。县城看似节奏慢,竞争压力小,但机会密度也低,资源更有限。你在北上广能靠技术或关系换来项目,在小地方可能连市场都起不来。
网友有人说“有100万够了,怎么还去送外卖?”——但从程序员角度看,100万就像启动资金,不会自己生息,烧一烧就没了。如果没有稳定 cash flow,再多存款也撑不住系统运行。
我的看法是:与其幻想“全局变量”解决问题,不如把技能当核心算法,不管在哪个城市,总能跑起来。 总的来说,脚踏实地升级自我,比寄希望于一次性存款靠谱得多。【备注:文末可领最新资料】
面试题:腐烂的橘子
有个网格,0 是空格子,1 是新鲜橘子,2 是烂橘子。每过 1 分钟,烂橘子会把上下左右的新鲜的“感染”成烂的。问要多久全烂,如果有橘子怎么都传不到,就返回 -1。这个题听上去像在模拟时间,其实更像一圈圈向外扩散,很自然就想到广度优先搜索(BFS)。
BFS 的关键在于“分层”,每一层代表一分钟。做法是把所有初始的烂橘子同时丢进队列,相当于多源起点一起出发。每一轮从队列里拿出当前层的所有点,把它们能感染到的邻居标记为烂,再统一入队。这样一层处理完,时间就加一。为什么要同时入队而不是边取边加时间?因为只有整层处理完才算过了一分钟,否则会把同一轮的传播误算成多分钟。
还需要两个小细节。第一,统计一开始新鲜橘子的数量 fresh;每当感染一个就减一。最后只要 fresh 变成 0,说明都烂完了。第二,注意初始如果没有新鲜橘子,答案就是 0;如果队列空了还剩新鲜的,说明被堵住了,返回 -1。边界检查也别忘了:坐标不能越界、遇到空格子要跳过、已经烂的也不用重复入队。
时间复杂度很好分析,网格里的每个格子最多进出队列一次,所以是 O(mn);空间也就是队列和网格本身,O(mn)。
下面是简洁的 Python 写法,用 collections.deque 管层次,dirs 放四个方向。minutes 只有在这一层里感染过至少一个新鲜橘子时才递增,这样可以避免最后多加 1 的尴尬。
from collections import deque
from typing import List
deforangesRotting(grid: List[List[int]]) -> int:
ifnot grid ornot grid[0]:
return-1
m, n = len(grid), len(grid[0])
q = deque()
fresh = 0
# 初始化:收集所有烂橘子作为多源起点,顺便数新鲜橘子
for r in range(m):
for c in range(n):
if grid[r][c] == 2:
q.append((r, c))
elif grid[r][c] == 1:
fresh += 1
if fresh == 0:
return0# 没有新鲜的,时间为 0
minutes = 0
dirs = [(1,0),(-1,0),(0,1),(0,-1)]
while q:
size = len(q)
infected = False# 本轮是否有新鲜变烂
for _ in range(size):
r, c = q.popleft()
for dr, dc in dirs:
nr, nc = r + dr, c + dc
if0 <= nr < m and0 <= nc < n and grid[nr][nc] == 1:
grid[nr][nc] = 2
fresh -= 1
infected = True
q.append((nr, nc))
if infected:
minutes += 1
return minutes if fresh == 0else-1
如果你想自测一下,随手构造个例子就行:[[2,1,1],[1,1,0],[0,1,1]] 会得到 4;而 [[2,1,1],[0,1,1],[1,0,1]] 会返回 -1,因为右下角那颗永远被隔断。这个题的套路还能复用到“火焰蔓延”“感染人数”之类网格扩散问题上,记住“多源 + 分层”的节奏就不容易踩坑了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领