Python技术迷

上海某公司表扬加班,榜一当月加班159.96小时。。

刚看到个贴子,说上海某公司表扬加班,榜一当月加班159.96小时,平均下班时间23:12 😮‍💨。网友们一边震惊一边吐槽,这么拼是自愿还是被动谁懂啊。

Image

159小时加班意味着几乎每天多干5小时,等于半个工作月白送,公司算下来成本极低,还能当正面案例宣传,真·资本家数学。网友有人说是敬业精神,但我觉得这是典型的用透支换绩效。从工程角度看,人就像服务器,24小时高负载迟早崩溃,宕机成本比节省的人力还高。

加班文化并不可怕,可怕的是把加班当成唯一评判标准。长期下来,创新力、稳定性都会被榨干。工作是马拉松,不是100米冲刺,别让自己变成一次性耗材。【备注:文末可领最新资料】

面试题:我能赢吗

昨晚十一点多,我在小区门口等外卖,风有点大,耳机里还在放那首老歌。小李突然在群里扔了个题,说“哥,那个‘我能赢吗’怎么写啊?”我就靠着路灯想了会儿,哦对,就是那个两个人轮流拿数、先到目标值就赢的游戏,对吧。

就是有个最大可选数 m,比如 1 到 m 都能拿;还有个目标值 T。两个人轮着来,每次从还没被拿走的数字里挑一个,加到自己的总分上。只要谁的累加一到 T,就结束。问先手能不能稳赢。听着像运气,其实不靠脸,算发…算法就能看穿。

我当时掐着手指头想:如果 1 到 m 的总和都小于 T,那别玩了,谁都到不了,直接返回 False。反过来,如果 m 本身都 ≥ T,先手随手拿 m 就秒杀,这个就 True。剩下的麻烦在于——哪些数还没被拿、现在轮到谁、还差多少,这仨东西得被“记住”。最省事的就是用位掩码 mask 表示哪些数用过了,剩余目标 remain 表示还差多少。然后做 DFS:只要我能找到一个数 i,使得拿了 i 之后,对手变成必输,那我现在就是必胜。这个“对手必输”的判断我们递归去问,用记忆化把问过的 mask 缓一下,不然会爆栈,呃不,是时间炸裂。

博弈题经典套路:当前玩家是否存在一步,把局面推到“对手必输”的坑里;如果所有选择都会把对手送到“必胜”局面,那你就凉了。这个是极小化极大思想的迷你版,别被名字吓着,代码很顺手。还有个小优化点:remain ≤ 0 说明上一步的人已经到线了,所以当前局面是失败局;遍历候选数时,先试大的,偶尔能更快剪枝,但不强求。

有两个小坑我那会儿在路灯下反复嘟囔:一是 m 最大到 20 的常见设定,所以用一个 int 的 bitmask 就够;二是 Python 的 lru_cache 会很香,但 mask 要作为参数传进去才行。另外,别忘了开场那俩“秒判”,能省很多回溯。

from functools import lru_cache

defcanIWin(maxChoosableInteger: int, desiredTotal: int) -> bool:
    m, T = maxChoosableInteger, desiredTotal
# 开场俩秒判
if T <= 0:
returnTrue
if m >= T:
returnTrue
# 全部数的和都不够
if m * (m + 1) // 2 < T:
returnFalse

    @lru_cache(None)
defdfs(mask: int, remain: int) -> bool:
# remain <= 0 表示上一步的人已经赢了,所以当前玩家输
if remain <= 0:
returnFalse
# 枚举可选数字,尽量从大到小试
for x in range(m, 0, -1):
            bit = 1 << (x - 1)
if mask & bit:
continue
# 选 x 后,如果让对手变成必输,我就必胜
ifnot dfs(mask | bit, remain - x):
returnTrue
# 所有选择都让对手必胜 -> 我必输
returnFalse

return dfs(0, T)

# 小测一下
if __name__ == "__main__":
    print(canIWin(10, 11))  # True,先手拿10,对手怎么折腾都能被拿死
    print(canIWin(10, 40))  # False,总和55虽够,但这里会回溯出必败态

行,我外卖到了,袋子还烫手。对了,有人问为啥第二个样例是 False,这个得靠搜索把“对手总能化解”的路径都确认一遍,你跑下代码就明白了。先吃一口,辣椒有点多…算了回来再聊。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领