最近看到一个网友的爆料真是忍不住笑出了声。
话说大厂经过了一波裁员优化后,竟然发现35+的员工简直是“宝藏员工”,堪比985/211毕业的牛人!
有人会问,为什么这么说?原来这些“35+”的老员工,不仅工作经验丰富,踩坑经验也足够多,简直是企业的“活字典”。他们以前经历过各种项目风波,做过无数个“后悔药”的选择,现在处理问题的效率和精准度完全不输年轻小伙子们。
不仅如此,他们通常特别“听话”,是那种公司说“去就去,不说去就不去”的员工。你给他们任务,他们几乎不用花太多时间解释,直接就能上手开始干活。而且,比起年轻人,他们在面对各种新技术时,也能保持一个理智的心态,知道什么时候该冒险,什么时候该保守,避免做出过于激进的错误决策。
别的不说,35+的员工在处理复杂的代码问题和系统故障时,往往能以更高的稳定性和精准度出色完成任务。甚至我有时候觉得,他们比起那些满脑子idea的年轻人,更能“稳住”全局。
所以真的应该多点宽容,多给35岁+的同学一些机会。
算法题:删除无效的括号
最近在刷算法题时碰到一个挺有意思的题目:删除无效的括号。
题目大致是这样的:给你一个字符串,里面包含了各种括号,有的括号是有效的(比如,成对出现的),有的则是无效的(比如,括号没配对好)。我们的任务是删除掉所有无效的括号,使得剩下的括号是有效的。
直观的思路
首先,大家可以想象一下,如果要删除无效的括号,最直观的办法就是遍历字符串,然后检查每个括号是不是能成对匹配。如果匹配不上,那就删掉它。但问题来了,这样直接遍历并删除,会导致什么?——你在删除括号的过程中,可能会破坏原有括号的顺序和位置。比如,当你删除某个括号后,后面的括号可能需要重新考虑。
所以,我觉得这种方法就不太靠谱,我们需要换个思路。
栈来救场
作为程序员,我们总能从栈这种数据结构中找到解决问题的灵感。对了,这个问题也可以通过栈来解决。
栈是一种先进后出(LIFO)的数据结构,简单理解就是“先放进去的,最后出来”。对于括号匹配问题,栈是个天然的好帮手。我们可以通过栈来辅助判断括号是否有效,同时利用栈来帮助我们标记哪些括号是无效的。
解决方案
遍历字符串:我们遍历每一个字符,遇到左括号时,压入栈;遇到右括号时,判断栈顶是否有对应的左括号。 有效性判断:如果栈顶有左括号,则出栈;如果没有,说明当前右括号是无效的,可以标记它为无效。 最终结果:在遍历完字符串后,栈里残留的左括号也是无效的,可以去掉它们。
代码实现
def removeInvalidParentheses(s: str) -> str:
# 标记有效位置
to_remove = set()
stack = []
# 第一遍扫描:删除不匹配的右括号
for i, char in enumerate(s):
if char == '(':
stack.append(i)
elif char == ')':
if stack:
stack.pop()
else:
to_remove.add(i)
# 第二遍扫描:删除不匹配的左括号
to_remove.update(stack)
# 生成结果字符串,删除需要删除的位置
return ''.join([char for i, char in enumerate(s) if i not in to_remove])
# 测试
s = "lee(t(c)o)de)"
print(removeInvalidParentheses(s)) # 输出: "lee(t(c)o)de"
代码解释
栈的使用:我们用一个栈来存储未配对的左括号的位置。当我们遇到右括号时,检查栈顶是否有对应的左括号。如果有,则这对括号是有效的,栈顶出栈。如果没有,说明这对括号是无效的,标记它的位置。
删除多余的括号:在第二轮遍历时,我们不仅删除无效的右括号,还要处理栈里剩下的左括号。因为栈里保存的是未匹配的左括号的索引,最后这些左括号是无效的,我们也需要删除它们。
构造结果字符串:我们遍历字符串时,如果某个位置的括号是无效的(即它的索引在
to_remove
集合中),就跳过;否则就把该字符加到结果中。
时间复杂度
这道题的时间复杂度是 **O(n)**,其中 n
是字符串的长度。因为我们遍历了字符串两次,且每次操作都只进行常数时间的检查和修改,所以时间复杂度是线性的。
空间复杂度
空间复杂度是 **O(n)**,主要用于存储栈和标记无效括号的位置。
总结
说实话,刚开始碰到这个题时我也以为会是那种“单纯匹配括号”的问题,没想到竟然要处理无效括号。用栈来解决这个问题确实是个不错的办法,它能够帮助我们简化问题的处理流程,不需要过多担心括号的位置和顺序。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。