青训营题目:素数元素的统计+单词出现频率统计题解

17 阅读4分钟

素数元素的统计

1.问题描述

小R给定了一个整数数组,要求你统计出其中有多少个元素既是素数,且这些素数元素的出现次数也是素数。需要注意的是,数组中元素的出现次数也应计算在内。比如,数组 [1, 2, 3, 2, 5, 7, 7, 7, 5] 中,元素 2 出现了两次,而 7 出现了三次,这些次数也都需要判断是否为素数。

2.解题思路

2.1问题分析

  • 输入:一个整数数组 a
  • 输出:一个整数,表示既是素数且出现次数也是素数的元素个数。

2.2基本思路

  1. 统计元素出现次数:使用 collections.Counter 来统计数组中每个元素的出现次数。
  2. 判断素数:编写一个辅助函数 is_prime 来判断一个数是否为素数。
  3. 筛选符合条件的元素:遍历统计结果,判断每个元素及其出现次数是否都为素数。
  4. 统计符合条件的元素个数:最后统计符合条件的元素个数。

2.3 数据结构与算法

  • 数据结构:使用 collections.Counter 来统计元素出现次数。
  • 算法:遍历统计结果,判断每个元素及其出现次数是否都为素数,并统计符合条件的元素个数。

2.4代码

from collections import Counter

def is_prime(n: int) -> bool:
    # 判断一个数是否为素数的辅助函数
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

def solution(a: list) -> int:
    # 统计数组中每个元素的出现次数
    count = Counter(a)
    
    # 初始化符合条件的元素个数
    result = 0
    
    # 遍历统计结果
    for num, freq in count.items():
        # 判断元素是否为素数
        if is_prime(num):
            # 判断元素的出现次数是否为素数
            if is_prime(freq):
                # 符合条件的元素个数加一
                result += 1
    
    return result

if __name__ == '__main__':
    print(solution([1, 2, 3, 2, 5, 7, 7, 7, 5]) == 3)
    print(solution([1, 4, 6, 8, 10, 12]) == 0)
    print(solution([3, 3, 3, 5, 5, 5, 5]) == 1)

3.代码详解

3.1 is_prime 函数

  • 功能:判断一个数是否为素数。

  • 实现

    • 如果 n 小于等于 1,直接返回 False
    • 遍历从 2 到 n 的平方根,如果 n 能被其中任何一个数整除,则返回 False
    • 否则返回 True

3.2 solution 函数

  • 功能:统计既是素数且出现次数也是素数的元素个数。

  • 实现

    • 使用 Counter(a) 统计数组中每个元素的出现次数。
    • 初始化 result 为 0。
    • 遍历统计结果,判断每个元素及其出现次数是否都为素数。
    • 如果都为素数,则 result 加一。
    • 最后返回 result

单词出现频率

1.问题描述

小U在学习英文时,需要统计英文句子中每个单词的出现次数,并按照字母顺序将统计结果进行排序。请你帮助小U编写一个程序,统计输入的英文句子中每个单词的出现次数,并将结果按字母顺序排序后输出。

2.解题思路

2.1问题分析

  • 输入:一个包含多个单词的英文句子。
  • 输出:一个列表,列表中的每个元素是一个字符串,格式为 "单词:出现次数",并且这些元素按照单词的字母顺序排序。

2.2基本思路

  1. 分割单词:将输入的句子按照空格分割成单词列表。
  2. 统计词频:使用 collections.Counter 来统计每个单词的出现次数。
  3. 排序:按照单词的字母顺序对单词进行排序。
  4. 格式化输出:将每个单词及其出现次数格式化为字符串,并放入列表中

2.4代码

from collections import Counter

def solution(s: str) -> list:
    # 分割单词
    words = s.split()
    
    # 统计词频
    word_count = Counter(words)
    
    # 按照字母顺序排序
    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'])

3.代码详解

  1. 分割单词words = s.split() 将输入的字符串 s 按照空格分割成单词列表。
  2. 统计词频word_count = Counter(words) 使用 Counter 统计每个单词的出现次数。
  3. 排序sorted_words = sorted(word_count.keys()) 按照单词的字母顺序对单词进行排序。
  4. 格式化输出result = [f'{word}:{word_count[word]}' for word in sorted_words] 将每个单词及其出现次数格式化为字符串,并放入列表中。

至此,完结撒花!