检查元素频次是否为质数
检查元素频次是否为质数
题目
第455场周赛
给你一个整数数组 nums。
如果数组中任一元素的 频次 是 质数,返回 true;否则,返回 false。
元素 x 的 频次 是它在数组中出现的次数。
质数是一个大于 1 的自然数,并且只有两个因数:1 和它本身。
示例 1:
输入: nums = [1,2,3,4,5,4]
输出: true
解释:
数字 4 的频次是 2,而 2 是质数。
示例 2:
输入: nums = [1,2,3,4,5]
输出: false
解释:
所有元素的频次都是 1。
示例 3:
输入: nums = [2,2,2,4,4]
输出: true
解释:
数字 2 和 4 的频次都是质数。
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100©leetcode
题解
由于数组大小n和数组的数值都在一百以内,所以可以直接对100内的所有数值算出是否质数。注意要申请的数组大小需要是101 而不是100,不然当题目给出频次为100的数组时,会越界。
这里算是否是质数的逻辑是用了除法,如果它能被比自己小的数字整除,就不是质数。下界是2,上界是平方根。
public class Solution {
public bool CheckPrimeFrequency(int[] nums) {
//统计所有频次
Dictionary<int,int> dict=new Dictionary<int,int>();
foreach(int v in nums){
if(!dict.ContainsKey(v)) dict[v]=0;
dict[v]=dict[v]+1;
}
// 100以内的所有zhishu
bool[] allZhi=new bool[101];
fillIsZhi(allZhi);
foreach(int f in dict.Values){
if(allZhi[f]){
return true;
}
}
return false;
}
private void fillIsZhi(bool[] arr){
arr[2]=true;
for(int i=3;i<100;i++){
arr[i]=true;
for(int j=2;j<=Math.Sqrt(i);j++){
if(i%j==0){//能被j整除,不是质数
arr[i]=false;
break;
}
}
}
}
}©leetcode
大佬解答
这个解答算是否质数用了反过来的思路,某个数的倍数都不是质数。
class Solution {
public boolean checkPrimeFrequency(int[] nums) {
int[] cnt = new int[200];
for (int x : nums) {
cnt[x]++;
}
for (int x : cnt) {
if (x > 0 && !np[x]) {
return true;
}
}
return false;
}
static int N = 200;
static boolean[] np = new boolean[N];
static {
np[0] = np[1] = true;
for (int i = 2; i < N; i++) {
if (!np[i]) {
for (int j = i + i; j < N; j += i) {
np[j] = true;
}
}
}
}
}

浙公网安备 33010602011771号