📜  通过删除给定数字的数字形成的唯一质数的计数(1)

📅  最后修改于: 2023-12-03 15:28:24.945000             🧑  作者: Mango

通过删除给定数字的数字形成的唯一质数的计数
介绍

此题目要求编写一个函数,输入一个正整数num和一个数字数组digits,返回删除digits中的数字后所能形成的唯一质数的个数。

例如,如果num为123,digits为数组[1,7,2],那么可能形成的数字有12,13,17,23,27,37等等,其中只有13和23是唯一质数,因此函数应该返回2。

思路

为了解决此题,我们需要先判断一个数字是否为质数。可以用试除法,从2开始依次除以小于等于该数一半的数字,如果有能被整除的数,则该数不是质数,否则就是质数。

接着,我们可以想到对于一个给定的数字,可以用递归的方式依次删除数字,并判断删除完后所得到的数字是否是质数,如果是则加1,否则继续递归删除。由于递归可能会产生重复的数字,我们可以用HashSet来过滤掉重复数字,最终返回HashSet的长度即是所求。

代码实现

下面是Java语言的代码实现,输入为一个整数num和一个整数数组digits,输出为一个整数,表示通过删除digits中的数字后所能形成的唯一质数的个数。

import java.util.*;
public class Solution {
    public int countPrimes(int num, int[] digits) {
        HashSet<Integer> set = new HashSet<>();
        for (int d : digits) {
            StringBuilder sb = new StringBuilder(Integer.toString(num));
            for (int i = 0; i < sb.length(); i++) {
                if (sb.charAt(i) == (char)(d+'0')) {
                    set.add(Integer.parseInt(sb.deleteCharAt(i).toString()));
                    sb.insert(i, (char)(d+'0'));
                }
            }
        }
        int count = 0;
        for (int n : set) {
            if (isPrime(n)) count++;
        }
        return count;
    }

    private boolean isPrime(int n) {
        if (n < 2) return false;
        for (int i = 2; i <= n/2; i++) {
            if (n % i == 0) return false;
        }
        return true;
    }
}
复杂度分析

算法时间复杂度为O(n^2),其中n为数字num的长度,因为对于每个数字,需要遍历一遍digits数组,每次删除一个数字并检查是否为质数的复杂度为O(n)。

空间复杂度为O(n),需要一个HashSet来存储可能生成的数字。