组合-Java

二进制解决组合问题:

public class CombinationByBinary {
    public static void combination() {
        /*
         * 基本思路:求全组合,则假设原有元素n个,则最终组合结果是2^n个。原因是: 用位操作方法:假设元素原本有:a,b,c三个,则1表示取该元素,0表示不取。故去a则是001,取ab则是011.
         * 所以一共三位,每个位上有两个选择0,1.所以是2^n个结果。 这些结果的位图值都是0,1,2....2^n。所以可以类似全真表一样,从值0到值2^n依次输出结果:即: 000,001,010,011,100,101,110,111
         * 。对应输出组合结果为: 空,a, b ,ab,c,ac,bc,abc. 这个输出顺序刚好跟数字0~2^n结果递增顺序一样 取法的二进制数其实就是从0到2^n-1的十进制数
         * ****************************************************************** *
         */
        String[] str = { "a", "b", "c" };
        int n = str.length; // 元素个数。
        // 求出位图全组合的结果个数:2^n
        int nbit = 1 << n; // “<<” 表示 左移:各二进位全部左移若干位,高位丢弃,低位补0。:即求出2^n=2Bit。
        System.out.println("全组合结果个数为:" + nbit + ",二进制:" + Integer.toBinaryString(nbit));

        for (int i = 0; i < nbit; i++) { // 结果有nbit个。输出结果从数字小到大输出:即输出0,1,2,3,....2^n。
            System.out.print("组合数值  " + i + " 对应编码为: ");
            for (int j = 0; j < n; j++) { // 每个数二进制最多可以左移n次,即遍历完所有可能的变化新二进制数值了
                int tmp = 1 << j;
                System.out.println(Integer.toBinaryString(tmp) + "---");
                if ((tmp & i) != 0) { // & 表示与。两个位都为1时,结果才为1
                    System.out.print(str[j]);
                }
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        combination();
    }
}

递归解决组合问题:

import java.util.ArrayList;
import java.util.List;

/**
 *
 * <p>
 * ClassName MyCombination
 * </p>
 * <p>
 * Description 一般地,从m个不同的元素中,任取n(n≤m)个元素为一组,叫作从m个不同元素中取出n个元素的一个组合。
 * </p>
 *
 * @author TKPad [email protected]
 *         <p>
 *         Date 2015年3月20日 下午10:45:59
 *         </p>
 * @version V1.0.0
 *
 */
public class MyCombination {
    public static void combiantion(char chs[]) {
        if (chs == null || chs.length == 0) {
            return;
        }
        List<Character> list = new ArrayList<Character>();
        for (int i = 1; i <= chs.length; i++) {
            combine(chs, 0, i, list);
        }
    }

    // 从字符数组中第begin个字符开始挑选number个字符加入list中
    public static void combine(char[] cs, int begin, int number, List<Character> list) {
        if (number == 0) {
            System.out.println(list.toString());
            return;
        }
        if (begin == cs.length) {
            return;
        }
        list.add(cs[begin]);
        combine(cs, begin + 1, number - 1, list);
        list.remove((Character) cs[begin]);
        combine(cs, begin + 1, number, list);
    }

    public static void main(String args[]) {
        char chs[] = { ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘ };
        combiantion(chs);
    }
}
时间: 2024-10-10 12:41:45

组合-Java的相关文章

分治法实现1-N的数字按字典序全排列组合 Java语言

package 分治法; import java.util.Arrays; /* * 将数字 1 - n进行全排列 按字典序从小到大输出 * 如 1 - 3 * 123 132 213 231 312 321 */ class GenerateP{ private int n; // 求 1-n所有数字的全排列 private final int maxn = 110;//最多可排列组合的长度 1-100 private boolean [] hashTable; private int []

第四章:对象的组合——java并发编程实战

一.设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1.收集同步需求(找出复合操作.多个变量遵循原子性的操作等) 2.依赖状态的操作(找出操作是否基于先验条件,例:取出当队列不为空) 3.状态的所有权(对象被哪些线程所有,哪些线程可以操作对象) 二.实例封闭 将数据封装在对象内部,可以将数据的访问限制在对象的方法上,确保简单正确的持有锁.(因为无需观察整个程序,只需检查当

如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?Java/JavaScript/C/Python耗时对比

如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a.b.c可能的组合? 不考虑算法优化,一千万次循环计算判断 Java/JavaScript/C/Python 多次测试耗时对比. Java 单次总耗时957毫秒 import java.util.Date; public class algorithm { public static void main(String[] args) { long start = new Date().getTime()

【新技术】现在最流行的java后台框架组合java springmvc mybaits mysql oracle html5 后台框架源码

升级报捷:通过服务于服务之间调用,生成二维码,可直接用户手机app(详细查看截图) 框架集成lucene搜索引擎,使您的信息在毫秒内抓取(详细查看截图) 1.  创建.初始化索引.统一搜索入口.搜索结果展现--内容.标题高亮.关键词搜索 2.  高级搜索:高级搜索增加多入口查询(精确查询.模糊查询.前缀查询等),每页显示条数自定义.索引结果数据设置.选择索引文档类型等 3. 通过A系统调用B系统的Rest服务,生成相关的二维码,可以直接用户手机app ----------------------

简单组合java.util.Map&lt;K,V&gt;实现Map&lt;K,P,V&gt;

java.util.Map<K,V>为单键对单值,有时需要双键对单值,因此基于Map<K,V>可以简单实现一个Map<K,P,V>. 接口定义:下载 Java代码 package cc.lixiaohui.demo.javassist.proxy.util; import java.util.Collection; import java.util.Set; /** * 两个键的复合map * <pre> * key------+ *          |-

java入门

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比如指针和多重继承.

Java快速教程

Java快速教程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比

转载:Java快速教程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响. Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比如指针和多重继承

[转] Java快速教程

[转] Java快速教程 转自:Vamei的Java快速教程 2015-07-03 安装环境 Step 1: Eclipse JDK 下载.安装.配置 (download.install.deploy) Step 2: eclipse Eclipse JDK 下载.安装.配置 (download.install.deploy) Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易