比裁员更侮辱人的事情发生了~
刚看到个贴子,说公司裁掉部门俩人,一个月薪1.5万、一个3万,活全甩给留下来的同事。人家提一句能不能涨点薪,结果被说成贪得无厌,搞得像犯了大错。
网友回帖我看了看,有骂老板抠门的,也有人说“多干点活算了,能保住饭碗就不错”。
我觉得这事吧,关键不是要不要讲奉献,而是要不要讲规则。岗位合并、活加倍,工资一点不动,连个说明都没有,只靠“讲大局”“讲感恩”压着,这才让人心寒。
多干活可以,但该争的也要争,提前把边界和价码说清楚,比事后憋屈强多了。
心软可以有,但底线不能丢,敢为自己开口的人,才更容易在职场站稳脚跟。
算法题:拆分二叉搜索树
昨晚十一点多吧 我在公司楼下抽烟(别学哈)我们组小李突然跑过来问我 东哥那个“拆分二叉搜索树”咋写啊…我当时脑子一热就说 这玩意跟线上切流量一个味儿 你把请求按阈值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]
对了 这个题我最喜欢的一点是它“很像架构里的边界治理”——你别上来就全量重构,先把边界切清楚,小的归小的,大的归大的,后面想做灰度、隔离、拆服务,都顺滑很多…哎我电话响了,先这样吧,等下我还得去把小李那段单测补上,不然他又要说“东哥我这怎么输出顺序不对”…