Python技术迷

比裁员更侮辱人的事情发生了~

刚看到个贴子,说公司裁掉部门俩人,一个月薪1.5万、一个3万,活全甩给留下来的同事。人家提一句能不能涨点薪,结果被说成贪得无厌,搞得像犯了大错。

Image

网友回帖我看了看,有骂老板抠门的,也有人说“多干点活算了,能保住饭碗就不错”。

我觉得这事吧,关键不是要不要讲奉献,而是要不要讲规则。岗位合并、活加倍,工资一点不动,连个说明都没有,只靠“讲大局”“讲感恩”压着,这才让人心寒。

多干活可以,但该争的也要争,提前把边界和价码说清楚,比事后憋屈强多了。

心软可以有,但底线不能丢,敢为自己开口的人,才更容易在职场站稳脚跟。

算法题:拆分二叉搜索树

昨晚十一点多吧 我在公司楼下抽烟(别学哈)我们组小李突然跑过来问我 东哥那个“拆分二叉搜索树”咋写啊…我当时脑子一热就说 这玩意跟线上切流量一个味儿 你把请求按阈值V一刀切 小的那边继续跑 大的那边单独兜着 就是这么个意思

二叉搜索树你们都知道吧 左边都小 右边都大 现在要拆成两棵树:一棵全是 <= V,另一棵全是 > V,而且原来节点尽量别新建 就地改指针(不然你一新建 节点引用全乱套 线上那种“幽灵数据”就来了)

我当时给小李打了个比方:你站在root这条“主干”上往下走

  • 如果 root.val <= V,那root肯定属于“小树”,问题只可能出在它的右子树里,因为右边可能混进一些 >V 的家伙,所以我们去拆右子树,拆完把“小那半截”接回 root.right
  • 如果 root.val > V,那root肯定属于“大树”,麻烦在左子树,因为左边可能有一堆 <=V,拆完把“大那半截”接回 root.left

就这么一递归,特别像排查链路超时:先判断这一步归哪边,再把剩下那截继续往下掰…哎我说着说着想起前几天线上报警了,算了不扯了,直接上代码

from __future__ import annotations
from dataclasses import dataclass
from typing import Optional, Tuple, List

@dataclass
classTreeNode:
    val: int
    left: Optional["TreeNode"] = None
    right: Optional["TreeNode"] = None

defsplit_bst(root: Optional[TreeNode], V: int) -> Tuple[Optional[TreeNode], Optional[TreeNode]]:
"""
    返回 (small, large)
    small: 所有节点值 <= V
    large: 所有节点值 > V
    尽量原地复用节点,只改指针
    """

ifnot root:
returnNone, None

if root.val <= V:
# root 属于 small,去拆右子树
        small_right, large = split_bst(root.right, V)
        root.right = small_right
return root, large
else:
# root 属于 large,去拆左子树
        small, large_left = split_bst(root.left, V)
        root.left = large_left
return small, root

你看就这几行 但坑也有…小李当时就问:那“保持BST性质”咋保证?我说你别慌 你每次只在“可能越界的那边”动刀,另一边整个都符合BST的约束,递归回来再把合规那截挂回去,树的相对结构就保住了

我怕他回去又写崩(新人嘛)又顺手写了个小测试,不然他一跑不对又来问我,我第二天早上还得早会…烦

definsert(root: Optional[TreeNode], x: int) -> TreeNode:
ifnot root:
return TreeNode(x)
    cur = root
whileTrue:
if x < cur.val:
if cur.left: cur = cur.left
else:
                cur.left = TreeNode(x)
break
else:
if cur.right: cur = cur.right
else:
                cur.right = TreeNode(x)
break
return root

definorder(root: Optional[TreeNode]) -> List[int]:
ifnot root:
return []
return inorder(root.left) + [root.val] + inorder(root.right)

if __name__ == "__main__":
    nums = [4, 2, 6, 1, 3, 5, 7]
    r = None
for n in nums:
        r = insert(r, n)

    V = 2
    a, b = split_bst(r, V)
    print("<=V:", inorder(a))  # [1,2]
    print(">V :", inorder(b))  # [3,4,5,6,7]

对了 这个题我最喜欢的一点是它“很像架构里的边界治理”——你别上来就全量重构,先把边界切清楚,小的归小的,大的归大的,后面想做灰度、隔离、拆服务,都顺滑很多…哎我电话响了,先这样吧,等下我还得去把小李那段单测补上,不然他又要说“东哥我这怎么输出顺序不对”…