题目描述
小U在学习英文时,需要统计英文句子中每个单词的出现次数,并按照字母顺序将统计结果进行排序。请你帮助小U编写一个程序,统计输入的英文句子中每个单词的出现次数,并将结果按字母顺序排序后输出。
样例1:
输入:
s = "New to Python or choosing between Python 2 and Python 3 Read Python 2 or Python 3"
输出:['2:2', '3:2', 'New:1', 'Python:5', 'Read:1', 'and:1', 'between:1', 'choosing:1', 'or:2', 'to:1']
解题思路及对应代码
思路一:直接循环+排序
直接使用简单粗暴的方法,此方法的核心在于手动处理字符串的分词和统计过程。首先,我们通过split(' ')方法将输入的英文句子分割成单词列表。然后,初始化一个空字典,用于存储每个单词及其出现次数。通过遍历单词列表,我们逐一检查每个单词是否已经在字典中,如果不在,则添加到字典中并计数为1;如果在,则增加该单词的计数。最后,我们需要将字典转换成列表形式,并按字母顺序排序输出。
完整代码
def solution(s: str) -> list:
s_ls=s.split(' ')
dic={}
for c in s_ls:
if c not in dic:
dic[c]=1
else:
dic[c]+=1
res = [f"{word}:{count}" for word, count in sorted(dic.items())]
return res
时空复杂度分析
- 时间复杂度:O(n + m log m),主要的时间复杂度来自于排序操作;
- 空间复杂度:O(m);
其中,n 是字符串的长度,m 是单词的数量。
思路二:使用Counter类统计单词出现次数
Python的collections模块提供了一个强大的工具——Counter类,它能够高效地统计列表中元素的出现次数。使用Counter类,我们可以简化代码,直接通过一行代码统计出单词的出现次数。这种方法不仅代码量少,而且易于理解,是处理此类问题的推荐方法。
代码
word_counts = Counter(s.split())
时空复杂度分析
总体上看,时空复杂度没有明显变化:
- 时间复杂度:O(n + m log m),主要的时间复杂度来自于排序操作;
- 空间复杂度:O(m);
其中,n 是字符串的长度,m 是单词的数量。
思路三:使用dict.get()方法
想起之前考计算机二级遇到过这类题,用的是dict.get() 方法。在Python字典中,dict.get()方法是一个非常实用的工具。它允许我们在获取字典中某个键的值时,如果该键不存在,可以返回一个默认值。这种方法在统计单词出现次数时,可以避免使用if语句来检查键是否存在,从而简化代码。
代码
for c in s_ls:
# 如果键不存在则返回 0,然后加 1
dic[c] = dic.get(c, 0) + 1
时空复杂度分析
总体上看,时空复杂度没有明显变化:
- 时间复杂度:O(n + m log m),主要的时间复杂度来自于排序操作;
- 空间复杂度:O(m);
其中,n 是字符串的长度,m 是单词的数量。