298.素数元素的统计
-
问题描述
小R给定了一个整数数组,要求你统计出其中有多少个元素既是素数,且这些素数元素的出现次数也是素数。需要注意的是,数组中元素的出现次数也应计算在内。比如,数组 [1, 2, 3, 2, 5, 7, 7, 7, 5] 中,元素 2 出现了两次,而 7 出现了三次,这些次数也都需要判断是否为素数。
-
思路解析
需要统计一个整数数组中,既是素数且其出现次数也是素数的元素个数。
-
数据结构选择
- Counter:使用
collections.Counter来统计数组中每个元素的出现次数。Counter会返回一个字典,键是数组中的元素,值是该元素在数组中出现的次数。 - 素数判断函数:编写一个函数来判断一个数是否为素数。
-
算法步骤
- 统计元素出现次数:使用
Counter统计数组中每个元素的出现次数。 - 判断素数:编写一个函数
is_prime,用于判断一个数是否为素数。 - 筛选符合条件的元素:遍历
Counter的结果,判断每个元素及其出现次数是否均为素数,如果是,则计数器加一。 - 返回结果:返回符合条件的元素个数。
-
解题步骤
-
统计元素出现次数:
- 使用
Counter(a)统计数组a中每个元素的出现次数。
- 使用
-
判断素数:
- 编写
is_prime函数,判断一个数是否为素数。 - 对于小于等于1的数,直接返回
False。 - 对于2,直接返回
True。 - 对于其他偶数,直接返回
False。 - 对于大于2的奇数,检查从3到
sqrt(n)之间的奇数,判断是否能整除。
- 编写
-
筛选符合条件的元素:
- 遍历
Counter的结果,判断每个元素及其出现次数是否均为素数。 - 如果均为素数,则计数器加一。
- 遍历
-
返回结果:
- 返回计数器的值。
-
需要注意的重点
-
素数判断的优化:
- 对于大于2的奇数,检查从3到
sqrt(n)之间的奇数,判断是否能整除。这样可以减少不必要的计算,提高效率。
- 对于大于2的奇数,检查从3到
-
双重判断:
- 在遍历
Counter的结果时,需要同时判断元素本身和其出现次数是否均为素数。只有在两者均为素数时,才更新计数器。
- 在遍历
-
筛选符合条件的元素:
- 双重判断:需要同时判断元素本身和其出现次数是否均为素数。
- 计数器更新:只有在元素和其出现次数均为素数时,才更新计数器。
-
代码部分
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)