题目解析
本题要求我们统计一个整数数组中,有多少个元素既是素数,且它们的出现次数也是素数。这个问题可以分为以下几个步骤来解决:
- 统计元素出现次数:首先,我们需要统计数组中每个元素出现的次数。这可以通过使用一个HashMap来实现,其中键是数组中的元素,值是该元素出现的次数。
- 判断素数:接下来,我们需要判断每个元素及其出现次数是否都是素数。素数是指只能被1和它本身整除的大于1的自然数。
- 统计满足条件的元素个数:最后,我们将统计满足上述条件的元素个数。
代码详解与分析
在之前的解析中,我们已经了解了题目的要求和解题思路。现在,让我们结合代码,进一步分析和理解这个问题的解决方案。
import java.util.*;
public class Main {
public static int solution(List<Integer> a) {
// 1. 统计元素出现次数
Map<Integer, Integer> countMap = new HashMap<>();
for (int num : a) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
// 2. 统计满足条件的元素个数
int count = 0;
for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
int num = entry.getKey();
int freq = entry.getValue();
// 判断元素和出现次数是否都为素数
if (isPrime(num) && isPrime(freq)) {
count++;
}
}
return count;
}
// 3. 判断一个数是否为素数
public static boolean isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(solution(Arrays.asList(1, 2, 3, 2, 5, 7, 7, 7, 5)) == 3);
System.out.println(solution(Arrays.asList(1, 4, 6, 8, 10, 12)) == 0);
System.out.println(solution(Arrays.asList(3, 3, 3, 5, 5, 5, 5)) == 1);
}
}
代码分析
-
统计元素出现次数:
- 使用
HashMap来存储每个元素及其出现次数。HashMap的put方法在这里用来更新元素的计数。如果元素不在HashMap中,getOrDefault方法会返回默认值0,然后我们将其加1后存回HashMap。
- 使用
-
统计满足条件的元素个数:
- 遍历
countMap中的每个条目,使用Map.Entry来同时获取键(元素)和值(出现次数)。 - 对于每个元素,使用
isPrime函数检查它和它的出现次数是否都是素数。如果是,计数器count增加。
- 遍历
-
判断素数:
isPrime函数首先检查传入的数是否小于等于1,因为1和负数都不是素数。- 然后,使用一个循环从2开始,检查到该数的平方根。如果在这个范围内找到任何能整除该数的数,那么这个数不是素数,函数返回
false。 - 如果循环结束都没有找到能整除的数,那么这个数是素数,函数返回
true。
知识总结
新知识点梳理分析:
- HashMap的使用:HashMap是一种基于哈希表的Map接口实现,它存储键值对,并允许我们快速地插入、删除和访问元素。在这个问题中,HashMap用于统计数组中每个元素的出现次数。
- 素数的判断:判断一个数是否为素数是算法中的一个常见问题。一个高效的方法是只检查到该数的平方根,因为如果一个数有大于其平方根的因子,那么它必定也有小于或等于其平方根的因子。
个人理解和学习建议:
- 算法效率:在判断素数时,只检查到平方根可以显著提高算法的效率。这是一个重要的优化技巧,对于处理大数据集时尤为重要。
- 数据结构选择:HashMap是统计元素出现次数的理想数据结构,因为它提供了快速的查找和插入操作。选择合适的数据结构可以简化问题并提高代码的效率。
- 代码可读性:代码的可读性对于维护和理解代码至关重要。在这个问题中,函数的命名和结构清晰,使得代码易于理解。
个人思考与分析
在这个问题中,我们使用了HashMap来统计元素的出现次数,这是一个非常合适的数据结构选择,因为它提供了快速的查找和插入操作。