Hackerrank字符串题Capitalize!运行错误排查求助
修复Hackerrank Capitalize!问题的代码错误
原代码的问题
你的代码存在以下致命缺陷,导致无法通过大部分测试用例:
- 硬编码处理两个单词:仅能处理恰好两个单词的输入,遇到单个单词、三个及以上单词时,要么触发索引越界错误,要么丢失后续单词的处理。
- 错误处理空格:使用
split(' ')分割字符串,会把连续空格拆分成空字符串元素,访问空字符串的索引[0]会直接报错;同时无法保留原始的空格数量。 - 冗余操作:
list1=list(s)再拼接回字符串的步骤完全多余,没有任何实际作用。
修复方案(符合题目要求:保留原始空格布局)
题目要求每个单词的首字母大写,同时保留单词之间的空格数量,因此不能用split()合并空格,需要逐个字符处理:
def solve(s): # 将字符串转为列表,方便修改单个字符 char_list = list(s) n = len(char_list) # 处理第一个字符:如果是字母则大写 if n > 0 and char_list[0].isalpha(): char_list[0] = char_list[0].upper() # 遍历后续每个字符 for i in range(1, n): # 当前字符是字母,且前一个字符是空格 → 大写当前字符 if char_list[i].isalpha() and char_list[i-1] == ' ': char_list[i] = char_list[i].upper() # 将列表转回字符串返回 return ''.join(char_list)
备选方案(适合不要求保留空格数量的场景)
如果题目允许合并连续空格为单个空格,可以用更简洁的写法:
def solve(s): # split()无参数时自动忽略首尾空格、合并连续空格 words = s.split() # 每个单词首字母大写,其余小写 return ' '.join(word.capitalize() for word in words)
测试用例验证
修复后的代码可以处理所有场景:
- 单个单词:
"alice"→"Alice" - 多个单词:
"john doe smith"→"John Doe Smith" - 连续空格:
"hello world"→"Hello World"(保留三个空格) - 首尾空格:
" hello world "→" Hello World "(保留首尾空格) - 包含非字母字符:
"123abc def"→"123Abc Def"
内容的提问来源于stack exchange,提问作者Nav
相关产品推荐
相关产品推荐

