被组长严重 pua,有点抑郁焦虑倾向,希望自己马上就能好起来,熬到过年、一切都会好起来的~
刚看到个贴子,说一网友被组长疯狂PUA,天天否定打压,搞得自己现在周一恐惧、焦虑抑郁倾向,只能靠“熬到过年”撑着。网友们有让ta立刻辞职的,也有说再忍忍领完年终的。
我觉得这事吧,首先问题真不在打工人身上。被长期贬低,谁都会情绪崩,不用再怪自己“太矫情”。但第二,情绪已经影响到生活和身体,就得当回事:能不能先把边界立起来,比如减少无效汇报,工作只做到职责范围;同时多找朋友、家人、甚至专业人士聊聊,把话说出来,人就没那么闷。
至于要不要走,别只想着“熬”,一边评估存款、机会,一边悄悄找下一家,给自己留后路。说到底,工作丢了还能再找,身体和心态垮了可真难补。
算法题:第K个语法符号
昨天晚上十一点多吧,我在公司楼下抽烟,手机叮叮叮一直响,群里有人说“东哥那个第K个语法符号我看晕了,N一大就爆栈”,我当时困得要死但又忍不住想回两句…你们知道那种感觉吧,明明是个算法题,写着写着像在排查线上协议包,0x开头那种错位,脑子里全是“这玩意到底翻转了几次”。
这个题说白了就是一行一行生成:0 变 01,1 变 10。你如果真按行生成,N=30那一行长度都 2^29 了,内存直接炸,跟你用 list 乱拼字符串一个味儿。后来我就换个想法:别管第 N 行长啥样,你就盯着第 K 个位置,它是从哪一路“复制+翻转”过来的。
我当时在便利店排队买咖啡,突然想到一个特别土但很管用的视角:从第 1 行走到第 N 行,每往下一层,其实就是把上层的每个符号分裂成两个,左边保持,右边翻转。那第 K 个在每一层到底走左还是走右?看 K 的二进制就行了:K-1 的每个 1,代表你在某一层走到了“右边那个会翻转的分支”。所以翻转次数=popcount(K-1)。翻转奇数次就是 1,偶数次就是 0。N其实只要保证 N 足够大能覆盖 K 的深度就行,题目给的 N 都满足。
代码我一般写两版,一版给面试官看着舒服(递归),一版给线上同学用(位运算不爆栈)。我这就贴个位运算版,Python3.8+ 直接 bit_count:
defkth_grammar(n: int, k: int) -> int:
"""
第K个语法符号:
行1: 0
0 -> 01, 1 -> 10
结论:答案 = popcount(k-1) % 2
n 只要 >= 1 且能覆盖 k 的层数即可(题目保证)
"""
return (k - 1).bit_count() & 1
# 随手测两下,别笑,我线上就这么干…
if __name__ == "__main__":
assert kth_grammar(1, 1) == 0
assert kth_grammar(2, 1) == 0# 01
assert kth_grammar(2, 2) == 1
assert kth_grammar(4, 5) == 1# 第4行:01101001,第5个是1
print("ok")
你要是更喜欢“像走树”那种感觉,也可以写递归:k 落在前半段就不翻,落在后半段就翻一次然后映射回去,但说实话,递归写着顺手,Python里一不小心就写成深递归,面试没事,真跑批量测试就…嗯你们懂的。
行了我先不说了,刚刚群里又有人@我问“bit_count老版本咋办”,我去回他两句,等会儿咖啡凉了又得买一杯…