1.题目
2.所需知识
2.1判断素数方法
2.1.1素数概念
素数就是一个数只能被1和它本身整除。
例如5,它就只能被1和5整除,2、3、4不能整除5,所以5是素数。
2.1.2代码展示
我们就可以根据它的意思写一个判断素数的方法
static boolean sushu(int n) {//n表示要判断是否为素数的数据
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n%i==0) return false;
}
return true;
}
2.1.3存在疑惑
或许有小伙伴有疑惑
为什么循环条件是i <= Math.sqrt(n),而不是i < Math.sqrt(n),因为如果n是完全平方数,例如n=9,那么Math.sqrt(n)等于3,此时我们需要包含3进行判断。
2.2数组去重全排列
2.2.1 去重全排列思想
去重全排列与无重复数组的全排列递归方法类似,使用递归函数实现。不同之处在于,我们需要添加一个HashSet来进行去重,以避免生成重复的排列。
如果还不了解数组的全排列递归方法,可以看我上一篇的“幻方填空_719”,链接如下
2.2.2代码展示
public static void permuteUnique(int[] nums, int start, int length) {
if (start == length - 1) { // 当前位置已经到了最后一个元素,输出排列结果
System.out.println(Arrays.toString(nums));
return;
}
Set<Integer> set = new HashSet<>(); // 使用HashSet来去重
for (int i = start; i < length; i++) {
if (!set.contains(nums[i])) { // 如果这个元素没有被处理过
set.add(nums[i]); // 将该元素加入set中
swap(nums, start, i); // 将当前位置的元素与后面的元素逐个交换
permuteUnique(nums, start + 1, length); // 继续处理下一个位置
swap(nums, start, i); // 还原交换的元素
}
}
}
public static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
3.题解
package 刷题记录;
import java.util.HashSet;
import java.util.Set;
public class {
static int count = 0;
public static void main(String[] args) {
int a[] = {1,4,9,9};
f(a, 0, a.length);
System.out.println(count);
}
static void f(int a[] , int start , int length) {
if (start == length - 1) {
int n = a[0]*1000+a[1]*100+a[2]*10+a[3];
if (sushu(n)) count++;
}
Set<Integer> set = new HashSet<>(); // 使用HashSet来去重
for (int i = start; i < length; i++) {
//在循环中,对于当前位置的元素,如果它没有被处理过(即没有出现在HashSet中),
//就将它添加到HashSet中,并执行交换和递归操作。当递归结束后,需要还原交换的元素。
//这样就可以实现处理有重复数据的全排列了。
if (!set.contains(a[i])) { // 如果这个元素没有被处理过
set.add(a[i]); // 将该元素加入set中
{int t = a[start]; a[start] = a[i];a[i] = t;}// 将当前位置的元素与后面的元素逐个交换
f(a, start+1, length);// 继续处理下一个位置
{int t = a[start]; a[start] = a[i];a[i] = t;}// 还原交换的元素
}
}
}
static boolean sushu(int n) {
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n%i==0) return false;
}
return true;
}
}
4.总结
通过判断素数方法和数组去重全排列方法就可以解决此问题。
此题因为数据小,这样做有些小题大做的样子,当我感觉主要是可以学到新的知识或是扩展了自己的知识面
5.期望
此题因为数据小,这样做可能觉得有些小题大做,但从长远来看,通过学习和掌握递归算法,你可以获得更深入的知识和技能,为将来解决更复杂的问题打下坚实的基础。
如果您对我的写作有任何疑虑,或是您认为还有改进的空间,我很愿意提供帮助并指出问题所在。同时,如果您有其他好的想法或建议,也欢迎分享,我们可以相互学习和启发。