Codewars字符串后缀匹配问题:(sumo, omo)测试用例循环索引异常
字符串后缀匹配问题的bug分析与修复
做Codewars练习时,写了一个判断字符串是否以指定后缀结尾的函数,大部分测试用例都通过了,但在("sumo", "omo")这个用例上出现异常:循环索引迭代到1后会重置为0,导致判断错误。
问题代码的bug根源
看这段循环逻辑:
for i in ending_list: num = ending_list.index(i) # ... 后续比较逻辑
list.index(i)的作用是返回列表中第一个等于i的元素的索引。当ending包含重复字符时,这个方法就会出错。比如测试用例里的ending="omo",反转后是['o','m','o']:
- 第一次循环i是'o',index返回0,逻辑正常;
- 第二次循环i是'm',index返回1,逻辑正常;
- 第三次循环i又是'o',index会返回第一个'o'的索引0,而非我们需要的2。
这就导致第三次比较的是text_list[0]和ending_list[0],而非对应后缀位置的text_list[2]和ending_list[2],最终判断出错。
修复方案:遍历索引而非元素
直接遍历索引,跳过通过元素找索引的步骤,就能保证每个位置对应正确:
修正后的代码:
def solution(text, ending): text_list = list(text) ending_list = list(ending) results_list = [] text_list.reverse() ending_list.reverse() if len(text_list) >= len(ending_list): # 直接遍历索引,确保每个位置一一对应 for num in range(len(ending_list)): if ending_list[num] == text_list[num]: results_list.append(0) print(num) else: results_list.append(1) return sum(results_list) == 0 else: return False
更简洁的Python内置解法
其实Python字符串自带了endswith()方法,一行就能解决所有情况,完全不用手动反转列表处理:
def solution(text, ending): return text.endswith(ending)
这个方法会自动处理所有边界场景(比如ending长度大于text的情况),效率更高也更可靠。
内容的提问来源于stack exchange,提问作者jhbetts
相关产品推荐
相关产品推荐

