每日一题蓝桥:组素数_722

本文介绍了如何使用Java实现判断素数的方法,以及如何利用递归和HashSet去重实现数组的全排列,强调了递归算法在解决此类问题中的重要性,有助于知识扩展和技能提升。
摘要由CSDN通过智能技术生成

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”,链接如下

幻方填空_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.期望

此题因为数据小,这样做可能觉得有些小题大做,但从长远来看,通过学习和掌握递归算法,你可以获得更深入的知识和技能,为将来解决更复杂的问题打下坚实的基础。

如果您对我的写作有任何疑虑,或是您认为还有改进的空间,我很愿意提供帮助并指出问题所在。同时,如果您有其他好的想法或建议,也欢迎分享,我们可以相互学习和启发。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023蓝桥Python B是一个Python编程竞赛别,属于蓝桥杯全国软件和信息技术专业人才大赛。蓝桥杯是中国最有影响力的IT竞赛之一,旨在发现和培养软件和信息技术领域的优秀人才。2023年将举办蓝桥杯竞赛中的Python B,意味着这个别将使用Python编程语言进行竞赛。 Python作为一种简单易学的编程语言,拥有较强的可读性和灵活性。它在数据分析、人工智能、Web开发等领域得到广泛应用。Python B的参赛选手有机会展示自己在Python编程方面的技术实力和创造力。 对于2023蓝桥Python B的参赛选手来说,要想在竞赛中取得好成绩,首先需要扎实的Python编程基础。熟悉Python的基本语法、掌握常用的库和模块,是竞赛成功的基石。 其次,参赛选手还需要具备良好的逻辑思维和问题解决能力。竞赛中可能遇到各种难题,需要分析问题、设计算法,并用Python代码实现解决方案。 此外,团队合作也是成功的关键。选手需要与队友密切合作,共同解决问题、讨论和优化代码。团队的相互支持和协作能够提高整个团队的竞赛水平和效率。 总的来说,2023蓝桥Python B是一个为期一年的Python编程竞赛,提供了一个展示个人实力和创意的舞台。参赛选手需要具备扎实的编程基础、良好的逻辑思维和问题解决能力,并与队友紧密合作,共同实现竞赛目标。参与这个竞赛可以提高个人的编程水平、锻炼团队合作能力,并有机会获得诸如荣誉证书、奖金等奖励。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值