一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 本题提供两个参数,paragraph是字符串,banned是列表
- paragraph是由英语句子组成的,里面包含大小写字母。
- banned列表元素都是小写字母。
- 要求在paragraph字符串中找到出现次数最多且不在banned列表的单词。
二、思路分析:
我们拿到本题,解析完题意要求是在一段语句中找到不是禁用单词并且出现次数多的单词。
首先,我们要知道一个常识:在英语语句中,标点符号有哪些。
- 无知的我,被NG之后。百度才知道。
- 英语语句中,有六种标点符号
了解完常识,解答该题思路也必将清晰了,前期需要做以下步骤:
- 对字符串paragraph里面的标点符号进行替换。
- 由于不区分大小写,且禁用列表的单词都是小写,所以对替换后字符串paragraph字母lower()全部转换成小写字母
- paragraph字符串调用split()进行空字符串分隔列表形式
接下来,对已经去掉标点符号、转换小写字母、去空格得到的paragraph_list进行遍历查找。
- 对 paragraph_list 里的元素进行去重,set(paragraph_list)。
- 定义tmp临时存储出现次数最多的单词,tmp_str 存储次数最多的单词
- 遍历的每一个元素,当元素不banned列表中,且在paragraph_list出现次数大于tmp时,则重新被赋值。
- 直到被遍历完最后一个元素,返回tmp_str
根据上述思路,我们使用Python很容易实现,代码如下:
class Solution(object):
def mostCommonWord(self, paragraph, banned):
"""
:type paragraph: str
:type banned: List[str]
:rtype: str
"""
for c in "!?.',;":
paragraph = paragraph.replace(c," ")
paragraph_list = paragraph.lower().split()
tmp = 0
tmp_str = ""
for i in set(paragraph_list):
if i not in banned and tmp < paragraph_list.count(i):
tmp = paragraph_list.count(i)
tmp_str = i
return tmp_str
三、总结:
本题实现思路比较清晰,存在一个坑就是要考虑全英语语句标点符号,否则提交时会发现很多case都跑不过。AC记录如下:
时间复杂度O(P+B),需要对paragraph和banned进行遍历
空间复杂度O(P+B),需要存储对遍历paragraph单词的出现的次数。
以上是本期内容,欢迎大佬们点赞评论,下期见~~