把OpenClaw部署到全公司,实时监控每个员工的电脑使用记录。
把这种东西一口气部署到全公司,味儿一下就变了。表面叫管理,实际就是给每个员工脑门上装了个电子监工。鼠标停几秒、切了几次窗口、几点开机、几点锁屏,后台全给你记着,跟查考勤似的盯到手指头。
最逗的是,有些老板真觉得这套玩意一上,效率就能原地起飞。评论区有人说得挺损:下一步是不是连喝水去几趟都要出周报。还有人说,这种公司不是在防摸鱼,是默认全员有罪。
我看这事最难受的,不是监控本身,是那股明晃晃的不信任。班还没上明白,先把你当贼防着。
算法题:原子的数量
这题我第一眼就不太想写递归。
不是递归不行,是这种化学式解析题,一旦遇到多层括号、元素名长度不固定、数字还可能跟在右边,递归很容易写着写着把自己绕进去。像 K4(ON(SO3)2)2 这种字符串,看着不长,真下手时最容易错的不是大逻辑,反而是指针怎么走、什么时候合并计数、什么时候乘倍数。
这题本质上就是一件事:把每一层括号里的原子计数先攒起来,遇到右括号再整体放大,然后回灌到上一层。
所以我一般直接上栈,少绕弯。
先看最关键的几个现场动作:
遇到 (,说明新的一层开始了,压一个空字典进去。遇到元素名,比如 Mg、O、He,就把后面的数字一起吃掉,记到当前层。遇到 ),说明当前层结束,把这一层弹出来,再把右边的倍数读出来,整体乘完后并回上一层。
这类题不要急着想着“怎么还原整串公式”,先盯住一个局部。比如:
(SO3)2
这一段如果单独算,括号里是:
S: 1
O: 3
右边倍数是 2,那就变成:
S: 2
O: 6
然后再往外合并。整个过程其实很像平时排查嵌套 JSON,先把里层对象算干净,再往外抬,不要一上来想一次性全吃掉。
代码我会这么写,故意没拆太碎,比赛和面试时都够用了:
from collections import defaultdict
classSolution:
defcountOfAtoms(self, formula: str) -> str:
n = len(formula)
stack = [defaultdict(int)]
i = 0
while i < n:
ch = formula[i]
if ch == '(':
stack.append(defaultdict(int))
i += 1
elif ch == ')':
i += 1
start = i
while i < n and formula[i].isdigit():
i += 1
multiple = int(formula[start:i]) if start < i else1
top = stack.pop()
for atom, cnt in top.items():
stack[-1][atom] += cnt * multiple
else:
start = i
i += 1
while i < n and formula[i].islower():
i += 1
atom = formula[start:i]
start = i
while i < n and formula[i].isdigit():
i += 1
count = int(formula[start:i]) if start < i else1
stack[-1][atom] += count
ans = []
for atom in sorted(stack[-1]):
ans.append(atom)
if stack[-1][atom] > 1:
ans.append(str(stack[-1][atom]))
return''.join(ans)
这段代码有两个细节我会多看一眼。
一个是元素名读取:大写字母开头,后面可能跟若干小写字母。像 H 和 He,不能混。另一个是数字读取:没写数字就默认是 1。这两个地方最容易在手写时漏掉边界。
时间复杂度不算吓人,主流程就是扫一遍字符串,最后再按字典序输出,核心开销主要在排序上。面试里只要你能把“括号层级 + 倍数回灌”讲清楚,这题基本就稳了。
这种题说是字符串,实际上考的是你有没有分层处理的习惯。看到括号就想栈,先别抖机灵。真到写代码的时候,老老实实把指针往前推,反而最不容易出错。