Java求一个集合的所有子集

转载请注明出处:

求一个集合的所有子集表示从一个集合当中,任取任意项或不取,所能得到的所有结果,比如有一个集合{a,b,c,d},那么{a,b}, {b, d}等都是它的子集,空集也是它的子集,

 一个具有n 个元素的集合,它的子集共有2^n个,因为对于每个元素都有两种可能:选与不选。

具体的编程思想如下:

复制代码
package com.example.demo.lettcode;

public class SubSet {

    public static void main(String[] args) {
        char[] charArr = {'a','b','c','d'};
        subSet(charArr);
    }

    /**
     * 思路:将每个元素拆分组合,对每个元素而言,只有两种选择,选中或为选中,从而可以考虑使用二进制的方式。
     *  且由于每个元素在一个组合里面只有两种可能,所以可以得出总共的组合数有  2的n次方。
     *  将2 的n次方进行 循环,每次匹配该值的二进数值,去根据二进制数中的1去匹配数组中的值
     *  从而打印出所有的组合
     *
     * @param charArr
     */
    public static  void subSet(char[] charArr){
        int charLength = charArr.length;
        for (int i = 0; i < (1<<charLength); i++) {
            String setStr = Integer.toBinaryString(i);
            int unChoose = charLength-setStr.length();
            System.out.print("{");
            for (int j = 0; j < setStr.length(); j++) {
                if (setStr.charAt(j)=='1'){
                    // 若数组长度为4,获取0010组合时;setStr = 10 ;元素 unChoose =2,charArr[unChoose+i] = charArr[2+0] = charArr[3] = c
                    System.out.print(charArr[unChoose+j]);
                }
            }
            System.out.println("}");
        }
    }
}
复制代码

 

posted @   香吧香  阅读(181)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2020-03-23 for-each循环使用iterator进行遍历
2018-03-23 eclipse创建springBoot项目
2017-03-23 Mybatis配置映射文件中parameterType的用法小结
点击右上角即可分享
微信分享提示