java全组合

全组合


例如:

String[] str = {"a" , "b" ,"c"};

想要得到

{"", "a", "b", "c", "ab", "abc", "bc", "ac" };

或者

{"a", "b", "c", "ab", "abc", "bc", "ac" };

这样的组合。

求全组合,当假设原有元素n个,则最终组合结果是2^n个。
原因是:
用位操作方法:假设元素原本有:a,b,c三个,则1表示取该元素,0表示不取。取a时是001,取ab时是011.
一共三位,每个位上有两个选择0或者1.所以是2^n个结果。

将1分别左移a, b, c的下标0,1,2位得到1,2,4再分别与0,1,2,3,4,5,6,7进行&运算,当其!=0时,取其位置元素。

(i=0)&tmp={1,2,4}Value
000&0010
000&0100
000&1000
(i=1)&tmp={1,2,4}Value
001&0011 !=0 取a
001&0100
001&1000
(i=2)&tmp={1,2,4}Value
010&0010
010&0101 !=0 取b
010&1000
(i=3)&tmp={1,2,4}Value
011&0011 !=0 取a
011&0102 !=0 取b
011&1000
(i=4)&tmp={1,2,4}Value
100&0010
100&0100
100&1001 !=0 取c
(i=5)&tmp={1,2,4}Value
101&0011 !=0 取a
101&0100
101&1001 !=0 取c
(i=6)&tmp={1,2,4}Value
110&0010
110&0102 !=0 取b
110&1004 !=0 取c
(i=7)&tmp={1,2,4}Value
111&0011 !=0 取a
111&0102 !=0 取b
111&1004 !=0 取c

将所有表格汇总到一块就是

&1234567
001!=0 取a0!=0 取a0!=0 取a0!=0 取a
0100!=0 取b!=0 取a00!=0 取b!=0 取b
100000!=0 取c!=0 取c!=0 取c!=0 取c
ababcacbcabc

得到

{"", "a", "b", "c", "ab", "abc", "bc", "ac" };

i=1开始时候,得到

{"a", "b", "c", "ab", "abc", "bc", "ac" };

代码

    public static void Combination() {

        String[] str = {"a", "b", "c"};
        int n = str.length;                                  //元素个数。
        int nbit = 1 << n;                                     // “<<” 表示 左移
        System.out.println("全组合结果个数为:" + nbit);

        for (int i = 0; i < nbit; i++) {
            //结果有nbit个。输出结果从数字小到大输出:即输出0,1,2,3,....2^n。
            //for(int i=1 ;i<nbit ; i++) { 去掉空元素
            System.out.print("组合数值  " + i + " 对应编码为: ");
            for (int j = 0; j < n; j++) {
                int tmp = 1 << j;
                if ((tmp & i) != 0) {
                    System.out.print(str[j]);
                }
            }
            System.out.println();
        }
    }

结果

全组合结果个数为:8
组合数值  0 对应编码为: 
组合数值  1 对应编码为: a
组合数值  2 对应编码为: b
组合数值  3 对应编码为: ab
组合数值  4 对应编码为: c
组合数值  5 对应编码为: ac
组合数值  6 对应编码为: bc
组合数值  7 对应编码为: abc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值