Python技术迷

外包年薪 30万,体制内年薪10万,选哪个比较好?

刚看到个贴子,说一个程序员纠结:外包年薪30万,体制内年薪10万,选哪个?

Image

网友还说,“穷就选工资高的,家里有点资产就选体制内”。

Image

这话听着现实,但也太绝对了。 我觉得这事吧,关键得看你自己想要什么。外包赚得多,但真不稳定,加班、项目压榨都是常态;体制内虽然钱少点,但节奏稳、假期多、生活可预期。

说到底,这是“钱”和“安全感”的博弈。 网友说得没错,底子薄就先搞钱,活下来最重要。但如果你有点积蓄,也别光盯着眼前收入。体制内虽然慢,但能给你时间学习、积累,也能让生活没那么焦虑。 

换个角度看,没绝对的好坏,只有适不适合自己。你选的路,只要能让你睡得踏实,就是最好的路。【备注:文末可领最新资料】

面试题:非递减子序列

昨晚十一点多在公司楼下吹风,脑子里还在过那个题…你们肯定见过:给一串整数,找所有“非递减子序列”,长度至少2。非递减就是后一个不比前一个小,对吧,1,2,2 这种是OK的。

不是最长、不是数量上限,是把所有非递减子序列都列出来,而且要去重,比如相同数字多次出现别重复报。输入可能有负数、有重复,别被样例骗了。

我怎么想的

就是那个…回溯嘛。用一个path装当前选的数,从左往右枚举位置 i:

  • 如果path为空就随便选;
  • 否则必须满足 nums[i] >= path[-1];
  • 为了防止同一层(相同起点)重复,把“本层用过的值”丢进一个小set,这一层遇到相同值就跳过。注意是“本层”,不是全局。

代码我就贴了(Python)

from typing import List

deffindSubsequences(nums: List[int]) -> List[List[int]]:
    res = []
    path = []

defdfs(start: int):
if len(path) >= 2:
            res.append(path[:])
        used_this_level = set()
for i in range(start, len(nums)):
if nums[i] in used_this_level:
continue
ifnot path or nums[i] >= path[-1]:
                used_this_level.add(nums[i])
                path.append(nums[i])
                dfs(i + 1)
                path.pop()
    dfs(0)
return res

# 小测一下
if __name__ == "__main__":
    print(findSubsequences([4, 6, 7, 7]))
# 可能的输出(顺序不固定):
# [ [4,6], [4,7], [4,6,7], [6,7], [7,7], [4,7,7], [6,7,7] ]

复杂度和坑点我捞一下

时间最坏接近 O(2^n),因为子序列爆炸增长;空间是回溯栈 O(n) 加结果集。两个坑:一是去重要分层,不能全局去,不然会把合法的不同路径砍掉;二是比较条件用 >= 不是 >,因为允许相等,很多同学这儿会写错…我之前就写错过,唉。

如果要“严格递增”,把条件改成 >,去重逻辑不变;如果只要“最长长度”,那就是 LIS,用 DP 或者贪心+二分,完全是另一套了。好了我先去泡个茶,等会有人问我为啥结果顺序不一样——因为回溯遍历顺序不同嘛,重要的是集合内容对不对,别纠结哈。

-END-

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

🔥虎哥私藏精品🔥

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