SWE · Coding

snake_case转camelCase:先确定分隔符与大小写合同

首词不变,后续词首字母大写,非法空段不默默吞掉。

题目重点:首词不变,后续词首字母大写,非法空段不默默吞掉。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练只接受非空ASCII小写词、单underscore分隔,无首尾或连续underscore。
  • 若实际要求保留大写、数字、Unicode或leading underscore,需要另给规范,不直接用capitalize破坏后续字母。

解题路线

  1. split underscore得到parts,检查每词非空及合法字符。保留首词,后词仅首字母upper,后续按原样拼接。
  2. 转换不可逆:不同大小写源若允许可能碰撞,且camel大写边界不必能唯一拆原词。因此不要把此函数用作唯一用户ID规范化。
  3. 大量文本用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转换时碰撞与缩写边界如何处理?
✓已复制微信号!