CodeWars字符编码练习:重复字符编码代码失效求助
解决你的Duplicate Encode函数问题
我一眼就看出问题出在哪了——你在循环里直接修改了原字符串word,这导致后续的字符统计完全偏离了原始输入的情况!
举个具体的例子,比如你测试输入"(()":
- 转小写后是
"(()" - 第一次循环取到字符
'(',统计它在当前word里的次数是2,于是把所有'('替换成')',此时word变成了")))" - 接下来循环的字符变成了修改后的
word里的')',统计它的次数是3,于是又把所有')'替换成')'(看起来没变化,但已经完全忽略了原始输入里那个只出现一次的')') - 最终得到的结果是
")))",但正确结果应该是"))("
修正方案
我们需要先把原始字符串转成小写并保存为一个固定的参考字符串,然后基于这个参考字符串去统计每个字符的出现次数,而不是在循环中修改原字符串。这样就能保证每次统计的都是原始字符的出现次数。
修正后的代码如下:
def duplicate_encode(word): lower_word = word.lower() result = [] for ch in lower_word: if lower_word.count(ch) == 1: result.append("(") else: result.append(")") return "".join(result)
代码解释
- 首先把输入字符串转成小写,保存到
lower_word里,这个变量全程不会被修改,作为我们统计字符出现次数的依据 - 创建一个空列表
result来存储每个字符对应的替换结果(用列表拼接比字符串拼接效率更高,尤其是处理长字符串的时候) - 遍历
lower_word里的每个字符,对每个字符,用lower_word.count(ch)获取它在原始小写字符串里的出现次数,然后决定添加(还是)到result里 - 最后用
"".join(result)把列表拼接成字符串返回
优化小技巧(可选)
如果处理的字符串很长,count()方法每次都会遍历整个字符串,时间复杂度是O(n²)。我们可以先用collections.Counter提前统计好所有字符的出现次数,这样时间复杂度就能降到O(n):
from collections import Counter def duplicate_encode(word): lower_word = word.lower() char_counts = Counter(lower_word) return "".join("(" if char_counts[ch] == 1 else ")" for ch in lower_word)
这样不管输入是什么字符(包括(、)或者随机字符),都能正确处理啦!
内容的提问来源于stack exchange,提问作者Vedant Matanhelia
相关产品推荐
相关产品推荐

