You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:42:39