Python技术迷

把OpenClaw部署到全公司,实时监控每个员工的电脑使用记录。

把这种东西一口气部署到全公司,味儿一下就变了。表面叫管理,实际就是给每个员工脑门上装了个电子监工。鼠标停几秒、切了几次窗口、几点开机、几点锁屏,后台全给你记着,跟查考勤似的盯到手指头。

Image

最逗的是,有些老板真觉得这套玩意一上,效率就能原地起飞。评论区有人说得挺损:下一步是不是连喝水去几趟都要出周报。还有人说,这种公司不是在防摸鱼,是默认全员有罪。

我看这事最难受的,不是监控本身,是那股明晃晃的不信任。班还没上明白,先把你当贼防着。

算法题:原子的数量

这题我第一眼就不太想写递归。

不是递归不行,是这种化学式解析题,一旦遇到多层括号、元素名长度不固定、数字还可能跟在右边,递归很容易写着写着把自己绕进去。像 K4(ON(SO3)2)2 这种字符串,看着不长,真下手时最容易错的不是大逻辑,反而是指针怎么走、什么时候合并计数、什么时候乘倍数。

这题本质上就是一件事:把每一层括号里的原子计数先攒起来,遇到右括号再整体放大,然后回灌到上一层。

所以我一般直接上栈,少绕弯。

先看最关键的几个现场动作:

  1. 遇到 (,说明新的一层开始了,压一个空字典进去。
  2. 遇到元素名,比如 Mg、O、He,就把后面的数字一起吃掉,记到当前层。
  3. 遇到 ),说明当前层结束,把这一层弹出来,再把右边的倍数读出来,整体乘完后并回上一层。

这类题不要急着想着“怎么还原整串公式”,先盯住一个局部。比如:

(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。这两个地方最容易在手写时漏掉边界。

时间复杂度不算吓人,主流程就是扫一遍字符串,最后再按字典序输出,核心开销主要在排序上。面试里只要你能把“括号层级 + 倍数回灌”讲清楚,这题基本就稳了。

这种题说是字符串,实际上考的是你有没有分层处理的习惯。看到括号就想栈,先别抖机灵。真到写代码的时候,老老实实把指针往前推,反而最不容易出错。