单词出现频率统计 | 豆包MarsCode AI刷题

238 阅读4分钟

题解与思路

这道题目要求我们统计英文句子中每个单词的出现次数,并且按字母顺序输出统计结果。具体步骤可以分为以下几个部分:

  1. 输入处理:
    • 首先,我们需要把输入的句子拆分成单词。通常情况下,我们可以使用字符串的 split() 方法,它默认以空格为分隔符,将句子分割成多个单词。
  2. 统计单词出现次数:
    • 对于统计每个单词出现的次数,字典(dict)是一个非常合适的数据结构。每个单词作为键(key),出现的次数作为值(value)。我们可以遍历单词列表,并使用字典的 get() 方法来更新每个单词的计数。
  3. 排序:
    • 按照字母顺序输出时,我们需要对字典中的单词进行排序。Python 提供了 sorted() 函数,可以直接对字典的 items()(键值对)进行排序,默认是按键(单词)进行排序。
  4. 格式化输出:
    • 排序之后,我们需要将字典中的每个单词及其出现次数按照指定的格式输出,即 word:count。这里可以利用列表推导式来生成符合格式的字符串。

详细步骤

  1. 输入字符串的分割: 使用 split() 方法将句子转换为单词列表。
  2. 统计频率: 遍历单词列表,使用字典记录每个单词出现的次数。
  3. 排序字典: 利用 sorted() 函数对字典的键(即单词)进行排序。
  4. 生成结果: 将排序后的键值对转换为符合 word:count 格式的字符串,最终返回。

思路图解

  1. 分割句子: 例如,输入 "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']
    
  2. 统计单词频率: 使用字典进行统计,得出如下结果:

    word_count = {'New': 1, 'to': 1, 'Python': 5, 'or': 2, 'choosing': 1, 'between': 1, '2': 2, 'and': 1, '3': 2, 'Read': 1}
    
  3. 排序: 对字典按单词进行字母顺序排序:

    sorted_word_count = sorted(word_count.items())  # [('2', 2), ('3', 2), ('New', 1), ('Python', 5), ('Read', 1), ...]
    
  4. 格式化输出: 将每个单词和对应的出现次数按 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

思考与感受

  1. 代码简洁易懂:

    • 使用 Python 的内置函数,如 split()sorted()get() 等,代码简单且高效。
    • 字典是一个非常适合这种统计问题的数据结构,它可以快速地记录和查找每个单词的出现次数。
  2. 时间复杂度:

    • 分割字符串split() 函数的时间复杂度为 O(n),其中 n 是字符串的长度。
    • 统计单词频率:遍历单词列表的时间复杂度为 O(m),其中 m 是单词的数量。每次访问字典的时间复杂度为 O(1)。
    • 排序字典:排序的时间复杂度为 O(k log k),其中 k 是不同单词的数量(字典的长度)。
    • 格式化输出:将字典转换为格式化字符串的时间复杂度为 O(k)。

    所以总体时间复杂度为 O(n + k log k),其中 n 是句子长度,k 是不同单词的数量。

  3. 输出格式的灵活性:

    • 利用字符串格式化的方法,输出的格式易于调整和扩展。如果需求发生变化,例如需要改变输出格式,只需修改列表推导式中的格式化部分即可。

总结

这道题目的核心在于对字符串的分割、频率统计和排序三个操作的结合。通过字典来统计频率,并利用内置的排序功能进行字母顺序排列,整个过程简洁而高效。通过这种方法,不仅可以完成题目的要求,还能在实际编程中提高解决类似问题的能力。