数组元素的统计 | 豆包MarsCode AI刷题

21 阅读4分钟

题目分析

问题描述

给定一个整数数组,要求统计出其中有多少个元素既是素数,且这些素数元素的出现次数也是素数。

关键点

  1. 素数判断:需要判断一个数是否为素数。
  2. 元素计数:统计数组中每个元素的出现次数。
  3. 双重素数判断:既要判断元素本身是否为素数,也要判断该元素的出现次数是否为素数。

解题思路

  1. 素数判断函数

    • 定义一个函数 is_prime(n) 来判断一个数是否为素数。
    • 素数的判断逻辑:
      • 小于等于1的数不是素数。
      • 2是唯一的偶数素数。
      • 对于大于2的数,从3开始,逐个检查到该数的平方根,判断是否有其他因数。
  2. 元素计数

    • 使用 collections.Counter 来统计数组中每个元素的出现次数。
  3. 双重素数判断

    • 遍历计数结果,筛选出既是素数的元素。
    • 进一步筛选这些素数元素,判断它们的出现次数是否也是素数。

代码实现

def solution(a: list) -> int:
    from collections import Counter
    import math

    def is_prime(n):
        if n <= 1:
            return False
        if n == 2:
            return True
        if n % 2 == 0:
            return False
        for i in range(3, int(math.sqrt(n)) + 1, 2):
            if n % i == 0:
                return False
        return True

    count = Counter(a)
    prime_elements = [num for num in count if is_prime(num)]
    result = sum(1 for num in prime_elements if is_prime(count[num]))
    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)
   
   ```markdown
### 题目分析

#### 问题描述
给定一个整数数组,要求统计出其中有多少个元素既是素数,且这些素数元素的出现次数也是素数。

#### 关键点
1. **素数判断**:需要判断一个数是否为素数。
2. **元素计数**:统计数组中每个元素的出现次数。
3. **双重素数判断**:既要判断元素本身是否为素数,也要判断该元素的出现次数是否为素数。

### 解题思路

1. **素数判断函数**:
   - 定义一个函数 `is_prime(n)` 来判断一个数是否为素数。
   - 素数的判断逻辑:
     - 小于等于1的数不是素数。
     - 2是唯一的偶数素数。
     - 对于大于2的数,从3开始,逐个检查到该数的平方根,判断是否有其他因数。

2. **元素计数**:
   - 使用 `collections.Counter` 来统计数组中每个元素的出现次数。

3. **双重素数判断**:
   - 遍历计数结果,筛选出既是素数的元素。
   - 进一步筛选这些素数元素,判断它们的出现次数是否也是素数。

### 代码实现

```python
def solution(a: list) -> int:
    from collections import Counter
    import math

    def is_prime(n):
        if n <= 1:
            return False
        if n == 2:
            return True
        if n % 2 == 0:
            return False
        for i in range(3, int(math.sqrt(n)) + 1, 2):
            if n % i == 0:
                return False
        return True

    count = Counter(a)
    prime_elements = [num for num in count if is_prime(num)]
    result = sum(1 for num in prime_elements if is_prime(count[num]))
    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)

代码解释

  1. 素数判断函数 is_prime(n)

    • 使用简单的循环和条件判断来确定一个数是否为素数。
  2. 元素计数 Counter(a)

    • 使用 collections.Counter 来统计数组中每个元素的出现次数。
  3. 双重素数判断

    • 首先筛选出既是素数的元素。
    • 然后进一步筛选这些素数元素,判断它们的出现次数是否也是素数。

测试样例

  • 样例1[1, 2, 3, 2, 5, 7, 7, 7, 5]

    • 输出:3
    • 解释:元素 2 出现 2 次(素数),元素 5 出现 2 次(素数),元素 7 出现 3 次(素数)。
  • 样例2[1, 4, 6, 8, 10, 12]

    • 输出:0
    • 解释:没有素数元素。
  • 样例3[3, 3, 3, 5, 5, 5, 5]

    • 输出:1
    • 解释:元素 3 出现 3 次(素数),元素 5 出现 4 次(非素数)。

总结

  • 通过 is_prime 函数判断素数。
  • 使用 Counter 统计元素出现次数。
  • 双重筛选素数元素及其出现次数,最终统计符合条件的元素个数。