LeetCode句子单词计数问题:循环中计算值未正确追加,始终追加初始化值
咱们来一步步拆解你代码里的问题,看看为什么单词数总是没被正确追加到列表里:
核心错误分析
完全错误的追加条件
你把max_words.append(num_of_words)放在了if j==len(sentences[i][j])-1这个分支里,这里的逻辑彻底跑偏了:sentences[i][j]是句子里的单个字符,它的长度永远是1,所以len(sentences[i][j])-1等于0,这个条件只有当j=0(也就是遍历到句子第一个字符)的时候才会成立。而且这个判断还嵌套在“遇到空格”的if里面,所以只有当句子的第一个字符是空格时,才会触发append,但这时候num_of_words已经变成2了;而正常的句子(开头不是空格)根本不会执行append操作,这就导致你要么得到错误的值,要么列表里只有误触发的初始值1。多余的手动循环变量递增
你在for循环外面写了j+=1和i+=1,这完全没必要——Python的for循环会自动遍历range里的每个值,手动修改循环变量不会影响循环的执行,反而容易造成逻辑混淆。
修复方案
方案1:修复原始遍历逻辑
把max_words.append(num_of_words)移到内层循环的外面,这样每个句子遍历完成后,不管有没有空格,都能把统计好的单词数追加到列表里。同时改用更直观的for-each遍历,避免索引出错:
def mostWordsFound(sentences): max_words = [] for sentence in sentences: num_of_words = 1 for char in sentence: if char == " ": num_of_words += 1 # 内层循环结束后,追加当前句子的单词数 max_words.append(num_of_words) print(max_words) # 如果需要返回最大单词数,可以加 return max(max_words) sentences = ["please wait.", "continue to fight.", "continue to win."] mostWordsFound(sentences)
方案2:用Python内置方法简化逻辑
其实完全不用手动遍历字符数空格,Python的str.split()方法可以直接帮你把句子按空白字符分割成单词列表,然后取列表长度就是单词数,这个方法还能自动处理多个空格、开头结尾空格的情况,鲁棒性更强:
def mostWordsFound(sentences): max_words = [len(sentence.split()) for sentence in sentences] print(max_words) # 需要返回最大数的话,直接 return max(max_words) sentences = ["please wait.", "continue to fight.", "continue to win."] mostWordsFound(sentences)
运行这两个修复后的代码,你的测试用例都会输出[2, 3, 3],完全符合预期。
内容的提问来源于stack exchange,提问作者Mustafa

