题目重点:首词不变,后续词首字母大写,非法空段不默默吞掉。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练只接受非空ASCII小写词、单underscore分隔,无首尾或连续underscore。
- 若实际要求保留大写、数字、Unicode或leading underscore,需要另给规范,不直接用capitalize破坏后续字母。
解题路线
- split underscore得到parts,检查每词非空及合法字符。保留首词,后词仅首字母upper,后续按原样拼接。
- 转换不可逆:不同大小写源若允许可能碰撞,且camel大写边界不必能唯一拆原词。因此不要把此函数用作唯一用户ID规范化。
- 大量文本用join避免逐段+=潜在反复复制;输入定义足够窄才可用ASCIIupper实现确定行为。
手动走一遍
user_name_id→userNameId;single→single。_name、name_、two__words按本训练合同拒绝,而非各自猜删除或保留。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def camel(text):
# Strict lower snake_case: nonempty ASCII-letter words, no repeated/edge underscore.
parts=text.split('_')
if any(not part or any(c<'a' or c>'z' for c in part) for part in parts):raise ValueError("lower snake_case required")
return parts[0]+''.join(part[0].upper()+part[1:] for part in parts[1:])
复杂度
O(L)时间/O(L)输出与分词空间,L输入字符数。unicode casefold/upper可能改变字符数量,需要另预算。
易错点与追问
容易失分的边界
- capitalize会把后续字母全部小写,若允许已有大写会破坏内容。
- underscore作为有效标识符特殊前缀时不应无约定删掉。
继续深挖
- 若允许数字开头段,camel输出是否仍是合法变量名?
- 提供inverse转换时碰撞与缩写边界如何处理?
