AI 刷题 298.素数元素的统计 题解 | 豆包MarsCode AI刷题

67 阅读3分钟

298.素数元素的统计

  • 问题描述

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

  • 思路解析

需要统计一个整数数组中,既是素数且其出现次数也是素数的元素个数。

  • 数据结构选择

  1. Counter:使用 collections.Counter 来统计数组中每个元素的出现次数。Counter 会返回一个字典,键是数组中的元素,值是该元素在数组中出现的次数。
  2. 素数判断函数:编写一个函数来判断一个数是否为素数。
  • 算法步骤

  1. 统计元素出现次数:使用 Counter 统计数组中每个元素的出现次数。
  2. 判断素数:编写一个函数 is_prime,用于判断一个数是否为素数。
  3. 筛选符合条件的元素:遍历 Counter 的结果,判断每个元素及其出现次数是否均为素数,如果是,则计数器加一。
  4. 返回结果:返回符合条件的元素个数。
  • 解题步骤

  1. 统计元素出现次数

    • 使用 Counter(a) 统计数组 a 中每个元素的出现次数。
  2. 判断素数

    • 编写 is_prime 函数,判断一个数是否为素数。
    • 对于小于等于1的数,直接返回 False
    • 对于2,直接返回 True
    • 对于其他偶数,直接返回 False
    • 对于大于2的奇数,检查从3到 sqrt(n) 之间的奇数,判断是否能整除。
  3. 筛选符合条件的元素

    • 遍历 Counter 的结果,判断每个元素及其出现次数是否均为素数。
    • 如果均为素数,则计数器加一。
  4. 返回结果

    • 返回计数器的值。
  • 需要注意的重点

  1. 素数判断的优化

    • 对于大于2的奇数,检查从3到 sqrt(n) 之间的奇数,判断是否能整除。这样可以减少不必要的计算,提高效率。
  2. 双重判断

    • 在遍历 Counter 的结果时,需要同时判断元素本身和其出现次数是否均为素数。只有在两者均为素数时,才更新计数器。
  3. 筛选符合条件的元素

    • 双重判断:需要同时判断元素本身和其出现次数是否均为素数。
    • 计数器更新:只有在元素和其出现次数均为素数时,才更新计数器。
  • 代码部分

from collections import Counter
import math

def solution(a: list) -> int:
    # 统计每个元素的出现次数
    count = Counter(a)
    
    # 判断一个数是否为素数的函数
    def is_prime(n):
        if n <= 1:
            return False
        if n == 2:
            return True  # 2 是唯一的偶数素数
        if n % 2 == 0:
            return False  # 排除其他偶数
        # 检查从3到sqrt(n)之间的奇数
        for i in range(3, int(math.sqrt(n)) + 1, 2):
            if n % i == 0:
                return False
        return True
    
    # 筛选符合条件的元素
    result = 0
    for num, freq in count.items():
        # 判断num是否为素数,并且freq是否为素数
        if is_prime(num) and 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)