Python技术迷

离开鹅厂之后,35+同事们的就业现状

刚看到个贴子,说的是离开鹅厂后的35+同事们现状。有人去了字节组AI团队,有人准备回老家找开发岗,还有人拿着两百多万存款打算做外包,也有的干脆出国重新开始。看完挺感慨的。

Image

网友们都在讨论“中年危机”,但在我看来,这更像是“重新定义安全感”。互联网的黄金时代过去了,很多人不得不重新调整自己的节奏。继续拼的不是运气,而是适应力。

从我的角度看,那些能主动转型、敢跳出舒适圈的,反而更有出路。技术淘汰快,但人只要不躺平,永远有下一站。哪怕是去小厂、外包、回老家,都是一种务实的选择。

说到底,职场没永远的铁饭碗,但有永远的学习力。时代变了,但只要还愿意折腾,就不会被淘汰。【备注:文末可领最新资料】

面试题:从字符串生成二叉树

昨晚十一点多我在客厅打游戏…哎对对,先别喷,一边玩一边给我们组那个小李讲题,讲着讲着就扯到“从字符串生成二叉树”,他非说用递归写麻烦。我就顺手敲了个 Python 版,思路很直白,给你们也说下,口味清淡点,别太学术。

输入怎么约定?

就是那个…常见的 LeetCode 风格哈:层序,逗号分隔,空节点用null。比如:"1,2,3,null,4,null,5" 表示根是 1,下一层是 2 和 3,2 的左子是空、右子是 4,3 的右子是 5。空格随便有都行,我们会 strip。空串或者全是空也要能稳住,不崩。

层序就用队列嘛。先把字符串切成数组 tokens,建根节点入队;然后每次从队列取一个父节点,给它塞左孩子、再塞右孩子,指针往后推。遇到null就跳过。整个流程像发快递,按顺序配对,不要越界…嗯就这样。

Python 代码(可直接跑)

from collections import deque
from typing import Optional, List

classTreeNode:
def__init__(self, val: int,
                 left: Optional['TreeNode']=None,
                 right: Optional['TreeNode']=None)
:

        self.val = val
        self.left = left
        self.right = right
def__repr__(self):
returnf"TreeNode({self.val})"

defparse_level_order(data: str) -> Optional[TreeNode]:
# 清洗输入
ifnot data ornot data.strip():
returnNone
    tokens = [t.strip() for t in data.split(',')]
# 全空直接返回
if all(t == ""or t.lower() == "null"for t in tokens):
returnNone

defto_node(tok: str) -> Optional[TreeNode]:
if tok == ""or tok.lower() == "null":
returnNone
# 允许正负号和十进制
return TreeNode(int(tok))

    root = to_node(tokens[0])
if root isNone:
returnNone

    q = deque([root])
    i = 1
    n = len(tokens)

while q and i < n:
        parent = q.popleft()

# 左孩子
if i < n:
            left = to_node(tokens[i])
            i += 1
            parent.left = left
if left:
                q.append(left)

# 右孩子
if i < n:
            right = to_node(tokens[i])
            i += 1
            parent.right = right
if right:
                q.append(right)

return root

# 小工具:再把树层序打印回去,看看是否一致
defto_level_order(root: Optional[TreeNode]) -> str:
ifnot root:
return""
    q = deque([root])
    out: List[str] = []
while q:
        node = q.popleft()
if node:
            out.append(str(node.val))
            q.append(node.left)
            q.append(node.right)
else:
            out.append("null")
# 末尾多余的 null 去掉
while out and out[-1].lower() == "null":
        out.pop()
return",".join(out)

我刚才在公司楼下抽烟的时候(别学),拿这个测了个:"1, 2, 3, null, 4, null, 5" → 生成树后再to_level_order一下,能回到 "1,2,3,null,4,null,5",就说明配对没跑偏。有人问负数行不行?行,"-10,9,20,null,null,15,7" 也稳。

小坑

呃…有三个点你们注意下: 1)输入有多余逗号,比如结尾逗号,split 后会有空字符串,按null处理就好。 2)根节点就是null,那直接返回 None,不要硬建个“空根”。 3)tokens 不够长的时候(比如只给了左孩子),循环里记得每次都判 i < n,不然越界警告就来了。

复杂度

遍历每个 token 最多一次,时间 O(n),队列最多装 n/2 个节点,空间 O(n)。够用了,别抠这个…对吧。

行了我先去回个消息…哦对,有人要括号表达式那种1(2(,4),3)?这个也能写,用指针递归按val(left,right)解析就行,不过今天主题是层序版本,先这样,回头我再把另一个版本扔群里。

-END-

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

🔥虎哥私藏精品🔥

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