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

Leetcode 500键盘行Python set解法部分用例失败原因排查

Leetcode 500 键盘行问题代码bug排查

我尝试使用Python中的set(集合)方法求解该题目,大部分测试用例下代码可正常运行,但测试用例14运行失败。

原提交代码如下:

class Solution:
    def findWords(self, words: List[str]) -> List[str]:
        set_top = {'q','w','e','r','t','y','u','i','o','p'}
        set_mid = {'a','s','d','f','g','h','j','k','l'}
        set_low = {'z','x','c','v','b','n','m'}
        
        for i in words:
            set_i = set(i.lower())
            
            if set_i-set_top and set_i-set_mid and set_i-set_low :
                words.pop(words.index(i))
        
        return words

问题原因

代码核心bug是遍历列表的同时直接对原列表执行pop删除操作,这会导致列表索引动态偏移,部分元素会被直接跳过、不做合法性校验,最终返回错误结果。
举个直观的例子:假设待校验列表是["ab", "cd", "qwe"],第一次循环取索引0的元素"ab",判断不符合要求后执行pop删除,列表会变成["cd", "qwe"];第二次循环会直接取索引1的元素"qwe",原本索引位置1的"cd"被直接跳过,没有经过校验就留在了结果里。
你写的集合差集判断逻辑本身是可以跑通符合要求的场景的,但遍历中修改原列表的写法会直接导致元素漏判,这就是测试用例不通过的根本原因。

修正方案

不要在遍历过程中修改原列表,新建一个结果列表存储符合要求的单词即可,修正后代码:

class Solution:
    def findWords(self, words: List[str]) -> List[str]:
        set_top = {'q','w','e','r','t','y','u','i','o','p'}
        set_mid = {'a','s','d','f','g','h','j','k','l'}
        set_low = {'z','x','c','v','b','n','m'}
        res = []
        for word in words:
            char_set = set(word.lower())
            if char_set.issubset(set_top) or char_set.issubset(set_mid) or char_set.issubset(set_low):
                res.append(word)
        return res

用子集判断的写法比差集判断可读性更强,逻辑完全等价,也避免了遍历修改原列表的问题,所有测试用例都可以通过。

内容的提问来源于stack exchange,提问作者vasu dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:57:21