2025-12-05:檢查元素頻次是否為質數。用go語言,給定一個整數數組 nums,判斷數組中是否存在某個數,它在數組中出現的次數是質數。若至少有一個元素的出現次數為質數則返回 true,否則返回 false。説明:質數指大於1且只有1和自身兩個正因數的整數。

1 <= nums.length <= 100。

0 <= nums[i] <= 100。

輸入: nums = [1,2,3,4,5,4]。

輸出: true。

解釋:

數字 4 的頻次是 2,而 2 是質數。

題目來自力扣3591。

自然智慧即可。

📝 步驟詳解

  1. 統計元素頻率 程序首先創建一個空的映射(map)cnt,用於記錄每個整數在數組 nums 中出現的次數。接着,遍歷整個 nums 數組。對於數組中的每一個元素 x,都在映射 cnt 中將其對應的計數值加 1。遍歷結束後,映射 cnt 中就存儲了每個不同數字在數組中出現的頻次 。

  2. 檢查頻次是否為質數 獲得頻率統計後,程序開始遍歷映射 cnt 中的所有值,即每個數字的出現頻次 c。對於每一個頻次 c,程序使用 Go 標準庫 math/big 中的 ProbablyPrime(0) 方法來判斷其是否為質數 。這個方法對質數的判斷是確定性的(當入參為 0 時),能夠準確判斷 c 是否是質數。

  3. 返回判斷結果 在遍歷頻次的過程中,只要發現任何一個頻次 c 被確認為質數,函數會立即返回 true,表示數組中存在出現次數為質數的元素。如果遍歷完所有的頻次後,都沒有發現質數頻次,函數則返回 false

⏱️ 複雜度分析

  • 總的時間複雜度:**O(N + K * M)**。

    • N 是數組 nums 的長度。第一步統計頻率需要遍歷整個數組,時間複雜度為 O(N)。
    • K 是數組中不同數字的個數(即映射 cnt 的大小)。在最壞情況下,所有數字都不同,K 等於 N
    • M 是判斷一個最大為 N 的數是否為質數所需的時間複雜度。ProbablyPrime(0) 方法對於 N 的最大值 100 來説是非常高效的。
    • 因此,總體時間複雜度是線性的 O(N)。
  • 總的額外空間複雜度:**O(N)**。

    • 主要的空間開銷來自於存儲頻率統計的映射 cnt。在最壞情況下(所有元素都不同),該映射需要存儲 N 個鍵值對,因此空間複雜度為 O(N) 。

Go完整代碼如下:

package main

import (
	"fmt"
	"math/big"
)

func checkPrimeFrequency(nums []int) bool {
	cnt := map[int]int{}
	for _, x := range nums {
		cnt[x]++
	}
	for _, c := range cnt {
		if big.NewInt(int64(c)).ProbablyPrime(0) {
			return true
		}
	}
	return false
}

func main() {
	nums := []int{1, 2, 3, 4, 5, 4}
	result := checkPrimeFrequency(nums)
	fmt.Println(result)
}

在這裏插入圖片描述

Python完整代碼如下:

# -*-coding:utf-8-*-

from collections import Counter
import sympy

def check_prime_frequency(nums):
    """
    檢查數組中是否有數字的出現頻率是質數
    
    參數:
        nums: 整數列表
        
    返回:
        bool: 如果存在出現頻率為質數的數字則返回True,否則返回False
    """
    # 統計每個數字出現的頻率
    freq = Counter(nums)
    
    # 檢查每個頻率值是否為質數
    for count in freq.values():
        # 使用sympy的isprime函數檢查質數
        # 注意:sympy.isprime對小於2的數返回False
        if sympy.isprime(count):
            return True
    
    return False

# 測試樣例
if __name__ == "__main__":
    nums = [1, 2, 3, 4, 5, 4]
    result = check_prime_frequency(nums)
    print(result)  # 輸出: True
    
    # 更多測試用例
    test_cases = [
        [1, 1, 2, 2, 3],  # 頻率: 1(2次), 2(2次), 3(1次) - 質數頻率2
        [1, 1, 1],        # 頻率: 1(3次) - 質數頻率3
        [1, 2, 3],        # 頻率: 1(1次), 2(1次), 3(1次) - 沒有質數頻率
        [],               # 空數組 - 沒有質數頻率
        [5, 5, 5, 5],     # 頻率: 5(4次) - 4不是質數
    ]
    
    for i, test in enumerate(test_cases, 1):
        print(f"測試用例{i}: {test} -> {check_prime_frequency(test)}")

在這裏插入圖片描述

C++完整代碼如下:

#include <iostream>
#include <unordered_map>
#include <vector>
#include <cmath>

// 判斷一個數是否為質數
bool isPrime(int n) {
    if (n <= 1) return false;      // 1及以下的數不是質數
    if (n <= 3) return true;       // 2和3是質數
    if (n % 2 == 0 || n % 3 == 0) return false;  // 能被2或3整除的不是質數

    // 檢查6k±1形式的因子
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}

// 檢查數組中是否有數字的出現頻率是質數
bool checkPrimeFrequency(const std::vector<int>& nums) {
    // 使用哈希表統計每個數字的出現頻率
    std::unordered_map<int, int> frequency;

    // 統計頻率
    for (int num : nums) {
        frequency[num]++;
    }

    // 檢查每個頻率值是否為質數
    for (const auto& pair : frequency) {
        if (isPrime(pair.second)) {
            return true;
        }
    }

    return false;
}

int main() {
    // 測試用例
    std::vector<int> nums = {1, 2, 3, 4, 5, 4};

    // 調用函數並輸出結果
    bool result = checkPrimeFrequency(nums);
    std::cout << result << std::endl;  // 輸出: true

    // 更多測試用例
    std::vector<std::vector<int>> testCases = {
        {1, 1, 2, 2, 3},        // 頻率: 1(2次), 2(2次), 3(1次) - 質數頻率2
        {1, 1, 1},              // 頻率: 1(3次) - 質數頻率3
        {1, 2, 3},              // 頻率: 1(1次), 2(1次), 3(1次) - 沒有質數頻率
        {},                     // 空數組 - 沒有質數頻率
        {5, 5, 5, 5},           // 頻率: 5(4次) - 4不是質數
        {7, 7, 7, 7, 7, 7, 7},  // 頻率: 7(7次) - 7是質數
    };

    std::cout << "\n更多測試用例:" << std::endl;
    for (size_t i = 0; i < testCases.size(); ++i) {
        std::cout << "測試用例 " << i + 1 << ": ";
        for (int num : testCases[i]) {
            std::cout << num << " ";
        }
        std::cout << "-> "  << checkPrimeFrequency(testCases[i]) << std::endl;
    }

    return 0;
}

在這裏插入圖片描述