题解与思路
这道题目要求我们统计英文句子中每个单词的出现次数,并且按字母顺序输出统计结果。具体步骤可以分为以下几个部分:
- 输入处理:
- 首先,我们需要把输入的句子拆分成单词。通常情况下,我们可以使用字符串的
split()方法,它默认以空格为分隔符,将句子分割成多个单词。
- 首先,我们需要把输入的句子拆分成单词。通常情况下,我们可以使用字符串的
- 统计单词出现次数:
- 对于统计每个单词出现的次数,字典(
dict)是一个非常合适的数据结构。每个单词作为键(key),出现的次数作为值(value)。我们可以遍历单词列表,并使用字典的get()方法来更新每个单词的计数。
- 对于统计每个单词出现的次数,字典(
- 排序:
- 按照字母顺序输出时,我们需要对字典中的单词进行排序。Python 提供了
sorted()函数,可以直接对字典的items()(键值对)进行排序,默认是按键(单词)进行排序。
- 按照字母顺序输出时,我们需要对字典中的单词进行排序。Python 提供了
- 格式化输出:
- 排序之后,我们需要将字典中的每个单词及其出现次数按照指定的格式输出,即
word:count。这里可以利用列表推导式来生成符合格式的字符串。
- 排序之后,我们需要将字典中的每个单词及其出现次数按照指定的格式输出,即
详细步骤
- 输入字符串的分割: 使用
split()方法将句子转换为单词列表。 - 统计频率: 遍历单词列表,使用字典记录每个单词出现的次数。
- 排序字典: 利用
sorted()函数对字典的键(即单词)进行排序。 - 生成结果: 将排序后的键值对转换为符合
word:count格式的字符串,最终返回。
思路图解
-
分割句子: 例如,输入
"New to Python or choosing between Python 2 and Python 3 Read Python 2 or Python 3",会得到:words = ['New', 'to', 'Python', 'or', 'choosing', 'between', 'Python', '2', 'and', 'Python', '3', 'Read', 'Python', '2', 'or', 'Python', '3'] -
统计单词频率: 使用字典进行统计,得出如下结果:
word_count = {'New': 1, 'to': 1, 'Python': 5, 'or': 2, 'choosing': 1, 'between': 1, '2': 2, 'and': 1, '3': 2, 'Read': 1} -
排序: 对字典按单词进行字母顺序排序:
sorted_word_count = sorted(word_count.items()) # [('2', 2), ('3', 2), ('New', 1), ('Python', 5), ('Read', 1), ...] -
格式化输出: 将每个单词和对应的出现次数按
word:count格式输出:result = ['2:2', '3:2', 'New:1', 'Python:5', 'Read:1', 'and:1', 'between:1', 'choosing:1', 'or:2', 'to:1']
完整代码
def solution(s: str) -> list:
# 将输入字符串分割成单词列表
words = s.split()
# 使用字典记录每个单词出现的次数
word_count = {}
for word in words:
word_count[word] = word_count.get(word, 0) + 1
# 将字典按单词(键)进行字母顺序排序
sorted_word_count = sorted(word_count.items())
# 按指定格式 "word:count" 生成结果列表
result = [f"{word}:{count}" for word, count in sorted_word_count]
return result
思考与感受
-
代码简洁易懂:
- 使用 Python 的内置函数,如
split()、sorted()、get()等,代码简单且高效。 - 字典是一个非常适合这种统计问题的数据结构,它可以快速地记录和查找每个单词的出现次数。
- 使用 Python 的内置函数,如
-
时间复杂度:
- 分割字符串:
split()函数的时间复杂度为 O(n),其中 n 是字符串的长度。 - 统计单词频率:遍历单词列表的时间复杂度为 O(m),其中 m 是单词的数量。每次访问字典的时间复杂度为 O(1)。
- 排序字典:排序的时间复杂度为 O(k log k),其中 k 是不同单词的数量(字典的长度)。
- 格式化输出:将字典转换为格式化字符串的时间复杂度为 O(k)。
所以总体时间复杂度为 O(n + k log k),其中 n 是句子长度,k 是不同单词的数量。
- 分割字符串:
-
输出格式的灵活性:
- 利用字符串格式化的方法,输出的格式易于调整和扩展。如果需求发生变化,例如需要改变输出格式,只需修改列表推导式中的格式化部分即可。
总结
这道题目的核心在于对字符串的分割、频率统计和排序三个操作的结合。通过字典来统计频率,并利用内置的排序功能进行字母顺序排列,整个过程简洁而高效。通过这种方法,不仅可以完成题目的要求,还能在实际编程中提高解决类似问题的能力。