工资 2.3w,外企苟了8年,今年 35岁,本来准备被裁开始面试,结果一直裁不到,最近拿了阿里 offer涨薪 30%
刚看到个程序员网友的贴子,说一同事在外企苟了8年,35岁了本来准备被裁,结果裁不到,反倒拿了阿里的offer,薪资还涨了30%。🤑
程序员到35岁,尤其在大厂和外企混到这个年纪,多少都会有点“职场危机感”。但现实证明,只要你技术过硬、项目经历能打,风口来了还是能抓住机会。
对了,外企和互联网风格不一样,一个重稳定一个重速度,能在夹缝里活下来还逆袭,其实挺难的。很多程序员都担心被优化,但说到底,还是要不断提升自己的核心能力和“可被替代性”。
别怕35岁被裁,关键是你有没有让人无法忽视的本事。机会总留给有准备的人【备注:文末可领最新资料】
面试题:不同路径
其实这个题,说难不难,说简单你又很容易一不小心就绕晕自己,你们谁刷过这题啊?是不是有时候一晚上坐那儿就卡住,干瞪眼,饭都不想吃。
反正啊,题目意思其实特别朴实:给你一个m行n列的网格,从左上角走到右下角,每次只能往下或者往右走,问你一共有多少种走法。就这么个事儿,但你别看描述简单,真写起来,手残点儿的直接暴力DFS一通,分分钟把自己电脑干死,递归一大坨,根本下不来地。
我记得我第一次写,还是凌晨一点多,宿舍里哥们儿都睡了,我还在那算,写了个暴力递归,第二天早上起来一看还在跑……想抽自己一嘴巴。其实吧,正经写法就俩套路,递归+记忆化(有时候叫DP吧,其实是动态规划),或者直接来个dp数组解放自己。
要是直接递归,不加记忆化,复杂度直接爆炸,就是每一步有两种选择嘛,一直递归到头,分支多得跟蚂蚁搬家似的。所以你得加点缓存,要不真撑不住,Python写起来,带lru_cache装饰器那个,贼舒服,不用自己手写memo。
比如,代码是这样的,你们凑合看:
from functools import lru_cache
defuniquePaths(m, n):
@lru_cache(None)
defdfs(x, y):
if x == m - 1or y == n - 1:
return1
return dfs(x + 1, y) + dfs(x, y + 1)
return dfs(0, 0)
这玩意一看就懂,走到最后一行或者最后一列了,只能直着往下走了嘛,路径就一种。每一步都是下一个往右走和往下走两条路,加起来就完事儿。加了lru_cache,性能蹭蹭上来,别问为什么,问就是递归的重叠子问题全帮你省了。
要是想更标准点,不用递归,直接for循环搞一个二维dp表也行,反正地铁上我边站着边用手机敲了下,大致是这样:
defuniquePaths(m, n):
dp = [[1] * n for _ in range(m)]
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[-1][-1]
这dp数组什么意思?其实就是每个格子的走法等于它上面那个格子的走法加上左边那个格子的走法,别问,想象一下就明白了,每个点只能从上或者左来,其他方向都不让你走。这种写法,面试官要是再问你空间复杂度怎么优化,你就说其实可以滚动数组,反正只用到上一行的数据嘛,拿一维数组滚着来。
再或者你非要装个13,说组合数学什么的也能做,C(m+n-2, m-1),直接求组合数,代码也贼简单。不过一般人不这么写,除非你真是数学大神,像我这种半夜饿了只会数包子馅儿的,还是老老实实dp。
总结一下啊,这题难不难?难在刚开始脑袋不清楚的时候,总想一步步暴力递归,走着走着就死循环或者超时,其实冷静下来,dp或者记忆化一下,写起来就特舒服。生活里很多事儿也这样,走错一步绕回来就慢了,早点缓存住自己犯过的错,下次不再踩坑。
哎,对了,写完这题我还跑去煮了碗面,顺便给哥们炫耀了一把,谁还不是个会递归的人了?反正以后面试遇到这种类型题,记住,别硬刚,先冷静分析下是不是可以递推或者dp,别跟暴力杠上。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领