字符串里多几个横杠,很多人第一眼觉得这题没啥意思。真写的时候就容易拧巴:从尾部开始分组,先去掉旧的 -,再统一转大写,最后每 k 个字符插一个分隔符。顺序一乱,代码就开始长,边界也跟着乱。
这题我一般不先想“怎么拼字符串”,先想“数据怎么走最省事”。因为题目要求是从后往前每 k 个一组,那就别硬着头皮从前面切。先把原串里的横杠去掉,再转成统一格式,然后从尾巴往前收集,事情会顺很多。
比如:
这题真正容易写丑的地方,不在逻辑,在细节。有人喜欢一边遍历一边往结果里插 -,写到后面全是判断:是不是第一个字符、是不是刚好整除、前面有没有横杠。看着就累。这种题我更愿意先收集,再一次性翻转。
Python 我会这么写,代码不长,但几个动作分得很清楚:
deflicense_key_formatting(s: str, k: int) -> str: cleaned = []for ch in s:if ch != '-': cleaned.append(ch.upper()) buf = [] count = 0for i in range(len(cleaned) - 1, -1, -1): buf.append(cleaned[i]) count += 1if count == k and i != 0: buf.append('-') count = 0return''.join(reversed(buf))
这段代码有个好处:脑子里始终只有一条线。
先清洗数据,再倒着分组,再整体翻转。
比如输入:
print(license_key_formatting("2-5g-3-J", 2))print(license_key_formatting("5F3Z-2e-9-w", 4))
输出就是:
2-5G-3J5F3Z-2E9W
当然,这题也能用更“Python”的写法。比如先得到纯净字符串,再用切片从尾部按 k 分段。但我自己做题时不太迷信短代码,尤其这种带格式处理的题,短不一定稳。你现在看得懂,半个月后未必还愿意看第二遍。
再提一个边界:如果原字符串全是 -,那清洗完就是空串,最后应该返回空字符串。上面这份代码天然就兼容了,不需要额外补丁。这种顺手把边界吃掉的写法,通常比后面再 if not xxx 去兜底更舒服。
所以这题没什么高深算法,本质就是字符串清洗和分组。但写得顺不顺,差别挺大。碰到这种格式题,我一般就一句话:题目要求从哪边下刀,代码最好就从哪边下刀。 这样不容易绕。