Python技术迷

一线城市的笼子终于卖掉了,手握1000万现金,不伺候了,回五线城市做个不大不小的生意,房价低,成本低,太滋润了!

刷到个帖子:有人把一线那套“鸽子笼”终于卖了,手里攥着一千万现金,直接宣布不伺候了,回五线老家做点不大不小的生意,说那边房价低、成本低,日子更舒坦。

Image

评论区有人羡慕“人生赢家”,也有人提醒别把小城市想得太美:生意难做、人情成本不低,教育医疗也得算账。 我倒觉得,这事不是逃离也不是躺平,更像一次“重新排队”。

钱能换来选择权,但选择也要配计划:先留足现金流、别梭哈单一项目,把家庭需求和长期发展算清楚。能在低成本城市踏实经营、带动就业,其实挺体面。

关键不在城市几线,在你能不能把日子过稳、过明白。

算法题:子集

昨晚我在工位上啃外卖,那个麻辣香锅辣得我眼泪都出来了,产品同学突然丢一句:“哥,权限配置那个页面,用户一勾一堆开关,后台要把所有组合都算出来,方便做灰度策略。”我当时就……哎这不就是“子集”嘛,你们刷题那个经典题,换个壳还是它。

子集这玩意在架构里其实挺常见的,比如:一组 feature flag(A/B/C),你要把“选哪些、不选哪些”的所有可能列出来;再比如风控规则的开关组合、推荐召回的策略拼装,甚至你们写 DSL 的时候也会碰到。只是线上别真全展开,数量是 2^n,n 一大就炸,跟我那天把线程池默认参数忘了改一样,现场直接“热闹”起来……咳扯远了。

说回题本身:给你一个数组 nums,要返回它的所有子集(包含空集)。我一般不爱背模板,就记一个感觉:每来一个新元素 x,就把当前已有的所有集合复制一份,在复制那份里都加上 x,这样就扩容一倍。这个思路特别像消息队列里“广播订阅”,一条消息来了,原来那批消费者照旧,新的一批消费者再加点处理逻辑,数量翻倍,形态很像。

我直接上 Python,你们拿去跑,别问我为啥变量名有点口语哈,写代码跟说话一样,顺手就行:

from typing import List

defsubsets(nums: List[int]) -> List[List[int]]:
# res 里先放一个“空配置”,也就是空集
    res: List[List[int]] = [[]]

for x in nums:
# 这一轮要新增的那些子集:把现有每个子集都“复制一份再加上 x”
        add_on = []
for old in res:
# old + [x] 会生成新列表,不会改动 old
            add_on.append(old + [x])
        res.extend(add_on)

return res


# 随手测一下
if __name__ == "__main__":
    print(subsets([1, 2, 3]))
# 你会看到 8 个:[], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]

你看这个写法好处是脑子省电,迭代一遍就完事,也不太容易写错回溯的撤销操作(我以前手滑忘了 pop,一晚上 debug 跟抓包似的看吐了)。复杂度也很直白:结果本来就有 2^n 个,时间和空间都绕不开这个量级。