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

70 阅读3分钟

噢噢噢我又来啦!

这次的题目是素数与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:

    image.png

  • 第7行到第12行:将素数元素作为key并且出现次数作为value存储到map中。

  • 第15行到第19行:判断素数出现的次数是否为素数。如果是,则计数器加一。

  • 最后返回计数器的具体值。OVER!!!

第六行将list又重新声明一遍,是因为如果不做这一步,会报错! 具体报错内容:java.lang.UnsupportedOperationException

实例模拟

a=[1, 2, 3, 2, 5, 7, 7, 7, 5]为例,进行代码模拟。

  1. map填充。依次判断a中的元素是否为素数。可以得到,2, 3, 2, 5, 7, 7, 7, 5为素数。存到map中的状态为:map={2=2, 3=1, 5=2, 7=3}
  2. 对map中的key进行素数判断。依次为:2为素数,count++;1不为素数;2为素数,count++;3为素数,count++。统计下来,count=3。
  3. 最终返回3。

小结

这属于map的小小的综合题型,不太难,选对数据存储类型、会写题目要求的算法就可以。

大家要合理借助AI,可以事半功倍噢!!!

see you 下期~~~