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
相关产品推荐
相关产品推荐

