📅  最后修改于: 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来存储可能生成的数字。