生成非空集合(逐步生成结果迭代)

1. 问题描述:

 请编写一个方法,返回某集合的所有非空子集。
 给定一个int数组A和数组的大小int n,请返回A的所有非空子集。
 保证A的元素个数小于等于20,且元素互异

2. 思路分析:

除了使用递归的方法还可以使用迭代的方法来解决,先创建存储集合的数据结构Set<Set<Integer>set并且进行初始化把第一个元素初始化为空集,然后通过for循环遍历这个集合,然后在for中创建一个新的Set<Set<Integer> setNew用来存储原来已经存在的集合,for循环遍历的是原来就已经存在的集合set , 然后往当前原来的集合添加当前元素,然后把它添加到setNew集合里面,然后把当前最新的元素集合赋值给set,方便下一次进行遍历添加元素(在for循环中新建一个setNew中是为了辅助作用因为不可能边遍历边向集合中添加元素的)

其中使用到了一个集合加入多个集合,所以要使用Set的addAll方法

3. 具体的代码如下:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
	public static void main(String[] args) {
		Scanner sc  = new Scanner(System.in);
		int n = sc.nextInt();
		int A[] = new int[n];
		for(int i = 0; i < n; i++){
			A[i] = sc.nextInt();
		}
		Set<Set<Integer>> set = solve(A, n);
		for(Set<Integer> set1 : set){
			if(set1.size() == 0){
				set.remove(set1);
				break;
			}
		}
		System.out.println(set);
	}

	private static Set<Set<Integer>> solve(int[] A, int n) {
		Set<Set<Integer>> set = new HashSet<>();
		//初始化为空集
		set.add(new HashSet<>());
		for(int i = 0; i < n; i++){
			//新建一个大集合
			Set<Set<Integer>> setNew = new HashSet<>();
			//把原来存在的多个子集合加进去
			setNew.addAll(set);
			//遍历之前的集合全部复制一遍,不能够加到set因为正在遍历着set
			for(Set<Integer> setHelp : set){
				Set<Integer> clone = (Set)((HashSet)(setHelp)).clone();
				//把当前元素加进去
				clone.add(A[i]);
				//把克隆的集合加入到大集合中
				setNew.add(clone);
			}
			set = setNew;
		}
		return set;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值