外包同事转正请客,大家点了4000多的菜,结账时外包同事说只付了2000,余下的大家AA,尴尬了!同事表示:早知道就不吃了
刚看到个贴子,说有个外包同事转正请客,本来大家点了4000多的菜,结果结账时他只付了2000,剩下的要大家AA,瞬间全场尴尬。有同事直言“早知道就不吃了”。
我作为程序员看这个事,第一反应就是——这是典型的“需求和实现不匹配”。转正请客,本质是社交投资,你要么别请,要请就得承担整单,否则逻辑就崩溃。很多网友说这人太精明,其实我觉得更像是没算清楚代价,拿写代码打个比方,就是调用了个库函数,但忘了考虑隐藏的依赖,结果项目报错。
换个角度想,饭局也是个团队协作的场景,若搞得大家都心里不舒服,那以后合作的信任值就下降了。程序员写代码要注意“可维护性”,做人也一样,别为了省点眼前的小钱,搞坏了长远的关系。【备注:文末可领最新资料】
面试题:从叶结点开始的最小字符串
昨晚十一点多,我在公司楼下吹风,手里奶茶快凉透了。小李冲下来问我:那个“从叶结点开始的最小字符串”,到底咋写?我脑子一热就开始比划:就是…从树底往上拼字,谁的字典序最小,谁赢,对吧。
二叉树每个节点是 025,对应 'a''z'。任意叶子到根形成一条路径,把数字转成字母,再反过来(因为方向是叶→根),比较字典序,取全局最小。坑点是:空树、只有根、还有多条路径“前缀相同后面一丢丢不一样”,都可能误判。
深度优先(DFS)最顺手:沿着根→叶走的时候,把当前字符塞进一个可回退的数组 path。到叶子就把 path 反过来拼出字符串 candidate,和答案比。为了不浪费时间,可以做个小剪枝:如果 path 反转后作为前缀,已经比当前 best 大了,就没必要再深入(不过实现要注意,只能在走到“确定前缀”的时候用,别玩花活)。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
classSolution:
defsmallestFromLeaf(self, root):
ifnot root:
return""
best = [None] # 用列表包一下,闭包里能改
path = []
defpush_char(v):
path.append(chr(ord('a') + v))
defpop_char():
path.pop()
defbetter(a, b):
# 返回 a 是否更小(b 可能为 None)
return b isNoneor a < b
defdfs(node):
push_char(node.val)
# 叶子:生成 candidate(叶->根 = path反转)
ifnot node.left andnot node.right:
cand = "".join(reversed(path))
if better(cand, best[0]):
best[0] = cand
else:
# 想做前缀剪枝可以这样:如果已经有 best,且
# 当前反转前缀大于等于 best 的前缀,就可以考虑少走一边
# 不过安全起见,这里保持简单可靠
if node.left:
dfs(node.left)
if node.right:
dfs(node.right)
pop_char()
dfs(root)
return best[0]
整棵树每条边最多走两次,时间 O(N)。path 至多是树高 H,额外空间 O(H),递归栈也算在里面。剪枝若上了,平均会更快,但最坏还是 O(N),别指望魔法。
昨晚我写快了,把路径直接 "".join(path) 就去比,结果全错,因为题目要“从叶开始”,必须 reversed(path)。还有,有些同学喜欢每到叶子就 path[::-1] 拷贝,OK 的,别在中间节点多次反转就行,不然白费功夫。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领