放弃大厂和电网选择上岸广州gwy,不得不说现在过得都是神仙日子啊!
刚看到个贴子,说有人放弃大厂和电网的机会,直接选择上岸广州gwy,现在日子过得舒舒服服,钱也不少,还感叹以前实习吃的苦都是白折腾。
我作为程序员看这事吧,挺能理解。大厂看起来光鲜,薪水高,但背后是没完没了的加班、项目赶工,像写代码一样,天天在 debug bug,精神压力巨大。网友有人羡慕稳定,有人觉得“可惜了技术前景”,我觉得其实就是权衡。大厂给的是快速成长和钱,但消耗的也是健康和时间;公务员给的是稳定和节奏感,写的虽然不是代码,而是公文,但起码不用半夜被 call 起床修线上问题。
换个角度想,程序员写需求,永远改不完;体制内写文件,虽然也繁琐,但确定性高,不用担心哪天项目砍掉就失业。说到底,选择没有对错,就像选语言,有人爱 Java 的稳定,有人追 Python 的灵活,各取所需。
找到让自己心里安稳的工作状态,比盲目卷更重要 【备注:文末可领最新资料】
面试题:不含 AAA 或 BBB 的字符串
昨晚十一点多,我在公司楼下吹风,手机一震,我们组小李问:哥,不含“AAA”或“BBB”的字符串到底咋算数量啊?我一边回他一边想,嗯…这个题别被字面唬住了,其实就俩字母,别连着三个一样就行,对吧。
就是长度为 n 的只含 A/B 的串,要求没有 “AAA” 也没有 “BBB”。你们知道吧,这种“不能出现连续 k 个”的题,十有八九是动态规划,或者——更轻松点——退化成斐波那契兄弟。
我开始也想把状态拆很细:最后一个字母是啥、当前连续长度是 1 还是 2。转移也好写:相同就把连续数 +1(但不能超过 2),不同就把连续数重置为 1。可是…说实话有点啰嗦,我懒,想要一个一维的。
关键观察:合法串的“最后一步”只有两种:
在一个合法的长度 n-1 串后面加与末位不同的字母; 在一个合法的长度 n-2 串后面加上“末位重复一次”的那位(因为不能重复三次,所以最多两连)。
于是就出来一个特别顺口的式子: g(n) = g(n-1) + g(n-2),初值 g(1)=2(A, B),g(2)=4(AA, AB, BA, BB)。是不是眼熟?对,像斐波那契,但起点不一样。小李当时“哦哦哦”地连发三个哦…差点又违规了,三连可不行,哈哈。
我就给他丢了这段,别学术,能跑就完事:
defcount_no_aaa_bbb(n: int) -> int:
if n <= 0:
return0
if n == 1:
return2# A, B
if n == 2:
return4# AA, AB, BA, BB
a, b = 2, 4# g(1), g(2)
for _ in range(3, n + 1):
a, b = b, a + b # g(n) = g(n-1) + g(n-2)
return b
# 想顺便构造一个样例(长度不大时)
defgen_no_aaa_bbb(n: int):
res = []
defdfs(s):
if len(s) == n:
res.append(s)
return
for ch in"AB":
if len(s) >= 2and s[-1] == ch and s[-2] == ch:
continue
dfs(s + ch)
dfs("")
return res
if __name__ == "__main__":
n = 5
print("数量:", count_no_aaa_bbb(n))
# 小 n 才打印样例,不然你电脑要喘气了
print("样例:", gen_no_aaa_bbb(4)[:10])
计数是 O(n) 时间、O(1) 空间,特别省。生成所有串就别问了,天生指数级,长度一大就炸,你们自己把控下。
有人会把初值写成 Fibonacci 的 F(1)=1, F(2)=1 那套,然后套错了系数,结果全偏。记住这题的 g(1)=2, g(2)=4 就好,后面全是加法。对了,我去热奶的时候想到,允许字母表更大或限制“不能有 k 连”,一样能把式子推广成 k 阶递推,不过先把这个两字母三连禁了的版本吃透,别一口吃个胖子。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领