改变世界的代码
刚看到个挺有意思的话题——“改变世界的代码”。贴子里写的那几行代码,看起来又笨又错,可有点意思:a、b、sum,这些简单变量背后,其实藏着人类最浪漫的想法——让机器帮我们思考。
改变世界的代码,从来不是最完美的那一段,而是那一行让人敢去尝试的那一段。就像最早的“Hello, world!”一样,看似普通,却宣告了人与机器交流的开始。
从我的角度看,技术的伟大,不在算法多高级,而在于它让更多普通人能参与创造。今天的AI、自动化、开源社区,都是靠一个个“跑不通”的小实验堆起来的。
所以别笑那几行错代码,它可能就是下一个时代的火种。【备注:文末可领最新资料】
面试题:标签验证器
昨晚十一点多,在公司楼下吹风,群里有人丢来一道“标签验证器”,我一口奶茶差点喷了——这玩意儿看着像HTML,其实比HTML“规矩”多一点点,写个校验器就行。简单说下,我怎么想的,别紧张,挺接地气的。
就是给你一串字符串,要求:
必须被一个外层标签整体包住,比如 <A>…</A>,标签名全大写,长度1~9。标签可以嵌套,要配对正确。 允许写CDATA: <![CDATA[...]]>,里面的内容原样忽略,不参与校验。其余就是常见的“尖括号成对”“不越界”这些…对吧。
别上来就正则,容易绕。这个更像状态机+栈: 一路从左到右扫,碰到三种东西:
<![CDATA[:那就一直跳到下一个]]>为止;</X>:这是结束标签,要跟栈顶匹配;<X>:这是开始标签,校验名字合法后压栈。 最后要求:栈必须清空,而且外层要从开头就开始,不能裸奔的文本在最外层乱飞。顺手再卡几个边界:空字符串不行、标签名要A-Z、长度限制,结束得有>,CDATA要关得上等等。就这样,思路稳。
代码(Python)
defis_valid(code: str) -> bool:
n = len(code)
stack = []
i = 0
defvalid_tag_name(name: str) -> bool:
return1 <= len(name) <= 9and name.isalpha() and name.isupper()
# 外层必须以标签开头
if n == 0or code[0] != '<':
returnFalse
while i < n:
if i > 0andnot stack:
# 外层标签结束后,后面还出现裸内容
returnFalse
if code.startswith("<![CDATA[", i):
j = code.find("]]>", i + 9)
if j == -1:
returnFalse
i = j + 3
elif code.startswith("</", i):
k = code.find('>', i + 2)
if k == -1:
returnFalse
name = code[i+2:k]
ifnot valid_tag_name(name):
returnFalse
ifnot stack or stack[-1] != name:
returnFalse
stack.pop()
i = k + 1
elif code.startswith("<", i):
k = code.find('>', i + 1)
if k == -1:
returnFalse
name = code[i+1:k]
ifnot valid_tag_name(name):
returnFalse
stack.append(name)
i = k + 1
else:
i += 1
returnnot stack
为啥这样能过
栈保证了嵌套关系; CDATA整段跳过,避免里面的怪字符捣乱; 外层“裸文本”拦住了:只有在栈非空时,才允许看到普通字符; 标签名规则单独函数,方便读。 我刚才在地库电梯口用几组用例试了下:合法的 <A><B><![CDATA[x]]></B></A>是True,像<A></A>text就是False,<A><B></A></B>也False,<A></B>更不行。
行了我先去热个馒头,回头有人问要不要加正则版本…算了不说了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领