噢噢噢我又来啦!
这次的题目是素数与Map的结合,难度:中等
题目描述
问题描述:
小R给定了一个整数数组,要求你统计出其中有多少个元素既是素数,且这些素数元素的出现次数也是素数。需要注意的是,数组中元素的出现次数也应计算在内。比如,数组[1, 2, 3, 2, 5, 7, 7, 7, 5]中,元素2出现了两次,而7出现了三次,这些次数也都需要判断是否为素数。
样例:
输入:a=[1, 2, 3, 2, 5, 7, 7, 7, 5]
输出:3
题目解析
很明显,题目要求判断素数,那么首先我们需要编写判断素数的方法。其次,题目中提到了元素的出现次数,这是在提示我们使用map作为数据结构。
现在就解决这个问题就很明了了。第一,判断素数。第二,key-value存储数据。需要注意的是,题目还需要对元素的出现次数进行素数判断。
代码实现
import java.util.*;
public class Main {
public static int solution(List<Integer> a) {
HashMap<Integer, Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>(a);
while (list.size() > 0) {
int cur = list.remove(0);
if (isPrime(cur)) {
map.put(cur, map.getOrDefault(cur, 0) + 1);
}
}
int count = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (isPrime(entry.getValue())) {
count++;
}
}
return count;
}
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);
}
}
我把判断素数的方法拆分出来,因为代码中会多次用到,这样可以减少代码冗余量。
代码解析
-
第23行到第33行:判断是否为素数。如果参数小于等于1,那么不是素数直接返回
false。如果参数大于1,那么进入循环,边界是[0, Math.sqrt(num)],只要取余不为零(即当前数没有除1和它本身的因数),则返回true,否则循环结束返回false。这边使用
Math.sqrt(num)作为边界是为了提高运作效率。具体原因我请教了AI: -
第7行到第12行:将素数元素作为key并且出现次数作为value存储到map中。
-
第15行到第19行:判断素数出现的次数是否为素数。如果是,则计数器加一。
-
最后返回计数器的具体值。OVER!!!
第六行将list又重新声明一遍,是因为如果不做这一步,会报错! 具体报错内容:java.lang.UnsupportedOperationException
实例模拟
以a=[1, 2, 3, 2, 5, 7, 7, 7, 5]为例,进行代码模拟。
- map填充。依次判断a中的元素是否为素数。可以得到,
2, 3, 2, 5, 7, 7, 7, 5为素数。存到map中的状态为:map={2=2, 3=1, 5=2, 7=3}。 - 对map中的key进行素数判断。依次为:
2为素数,count++;1不为素数;2为素数,count++;3为素数,count++。统计下来,count=3。 - 最终返回3。
小结
这属于map的小小的综合题型,不太难,选对数据存储类型、会写题目要求的算法就可以。
大家要合理借助AI,可以事半功倍噢!!!
see you 下期~~~