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

151 阅读3分钟

题目分析

在学习英文时,有时候需要对句子中的单词进行一些统计分析。例如,我们要统计每个单词在句子中出现的次数,并且按照字母顺序输出这些单词及其出现的次数。这是一个经典的字符串处理问题,通常用于练习基础的字符串操作、字典的使用以及排序方法。本题要求编写一个函数,接收一个英文句子作为输入,统计其中每个单词的出现次数,并按字母顺序输出统计结果。具体的输出格式为:单词:次数,并且按字母顺序排列

解题思路

解答这类问题的关键在于如何高效地统计单词的出现次数并且按字母顺序进行排序

1.分词:首先,我们需要将输入的句子按照空格进行拆分,得到每个单词。Python 提供了 split() 方法来处理这个任务,会按照空格、制表符等字符拆分字符串

2.统计单词频率:统计每个单词在句子中出现的次数。我这里使用一个字典(dict)来实现,字典的键(key)是单词,值(value)是该单词出现的次数。每次遇到一个单词时,更新它的出现次数。如果字典中没有该单词,则将其加入并初始化次数为1

3.排序:统计完成后,按照字母顺序排列所有的单词。可以使用 Python 的 sorted() 函数,它可以对可迭代对象(如列表、字典的键等)进行排序

4.格式化输出:最后,将每个单词及其出现次数按要求格式化成 单词:次数 的字符串,并返回排序后的列表

代码实现

    def solution(s: str) -> list:
    # 将字符串分割成单词,自动处理空白字符
    words = s.split()
    
    # 使用字典统计单词出现的次数
    word_count = {}
    for word in words:
        word_count[word] = word_count.get(word, 0) + 1
    
    # 对字典中的单词按字母顺序排序并生成结果列表
    sorted_words = sorted(word_count.keys())
    
    # 格式化输出
    result = [f"{word}:{word_count[word]}" for word in sorted_words]
    
    return result

if __name__ == '__main__':
    # 测试用例
    print(solution("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'])
    print(solution("hello world hello python") == ['hello:2', 'python:1', 'world:1'])
    print(solution("the quick brown fox jumps over the lazy dog") == ['brown:1', 'dog:1', 'fox:1', 'jumps:1', 'lazy:1', 'over:1', 'quick:1', 'the:2'])
    

复杂度分析

  1. 时间复杂度

    • 分词操作s.split() 需要遍历整个字符串,时间复杂度为 O(n),其中 n 是输入字符串的长度
    • 字典统计单词出现次数:遍历每个单词并更新字典,时间复杂度为 O(m),其中 m 是句子中单词的数量。每次插入或更新字典的操作时间复杂度是 O(1)
    • 排序操作:对字典的键进行排序,时间复杂度为 O(k log k),其中 k 是不同单词的数量
    • 格式化输出:生成结果列表需要遍历排序后的单词列表,时间复杂度为 O(k)

    因此,综合时间复杂度为 O(n + k log k),其中 n 是句子的总字符数,k 是不同单词的数量

  2. 空间复杂度

    • 存储输入的单词列表需要 O(m) 空间,其中 m 是句子中单词的数量
    • 字典存储每个单词及其出现次数,空间复杂度为 O(k),其中 k 是不同单词的数量
    • 排序后的结果列表需要 O(k) 空间

    因此,总的空间复杂度为 O(m + k)