`
lg_asus
  • 浏览: 191897 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

给出一串数字,算出所有组合值

阅读更多
public class AllOrderWithinNumbers {

	public static void main(String...args){
		int[] i = new int[]{1,2,4,5};
		AllOrderWithinNumbers t = new AllOrderWithinNumbers();
		ArrayList al = t.getOrders(i);
		System.out.println(al.size());
		System.out.println(al);
	}
	
	private ArrayList getOrders(int[] others){
		ArrayList al = new ArrayList();
		//如果只有一个数,则返回自身
		if(others.length==1){
			al.add(others[0]);
		}else{
			for(int i=0;i<others.length;i++){
				int[] t = this.getLeftNumber(others,i);
				ArrayList tmp = this.getOrders(t);
				//tmp.add(0,others[i]); //uncomment this line and comment the blow line, to see what the result is
				this.linkSubOrders(others[i],tmp);
				//这里要进行判断,如果tmp中包含ArrayList,那么直接addAll,把每一个ArrayList作为子元件插入到al中,如果tmp不包含ArrayList,那么要把tmp作为一个整体插入
//				al.add(tmp);// this line and the next 4 lines, you can compare the differences
				if(tmp.get(0) instanceof ArrayList){
					al.addAll(tmp);
				}else{
					al.add(tmp);
				}
			}
		}
		return al;
	}

	/**
	 * 
	 * @param i  开头数
	 * @param tmp  除了开头数之外其它数字组成的排序,由于在多个ArrayList中,因此要把开头数插入到每个ArrayList开头
	 * 注意:由于tmp中会存在嵌套的ArrayList,因此这里要进行嵌套ArrayList递归,如[1,[2,[3,4][4,3]],[3,[2,4][4,2]]...]要转换成[1,2,3,4],[1,2,4,3],[1,3,2,4]...这样的形式
	 */
	private void linkSubOrders(int i, ArrayList tmp) {
		if(tmp.get(0) instanceof ArrayList){
			for(int j=0;j<tmp.size();j++){
				ArrayList al = (ArrayList) tmp.get(j);
				this.linkSubOrders(i, al);
			}
		}else{
			tmp.add(0,i);
		}
	}

	/**
	 * copy others to a new array, not including the i-th number
	 * @param others
	 * @param i
	 * @return
	 */
	private int[] getLeftNumber(int[] others, int i) {
		int[] t = new int[others.length-1];
		for(int j=0;j<others.length;j++){
			if(j<i){
				t[j] = others[j];
			}
			if(j==i){
				
			}
			if(j>i){
				t[j-1] = others[j];
			}
		}
		return t;
	}
}


补:群里坦克大牛的一种写法,非常简洁:
private void test(){
    	 char[] dictionaries = "ABC".toCharArray();
    	 int limit = 1 << dictionaries.length;
    	 for (int mask = 1; mask < limit; mask++) {
    		 for (int submask = 1, i = 0; i < dictionaries.length; submask <<= 1, i++) {
    			 if ((mask & submask) != 0) {
    				 System.out.print(dictionaries[i]);
    			 }
    		 }
    		 System.out.println();
    	 }
     }

思路:首先知道所有组合数是2^n-1,也就是limit的大小, 对limit进行循环,这样就可以取出所有的组合了,注意submask,它是每循环一次左移一位,然后和mask进行&
分享到:
评论

相关推荐

    c# 数据组合 从一组数据中 返回组合的和等于某个值 的所有组合

    本主题探讨的是如何从一组数据中找到所有组合,这些组合的和等于给定的目标值。这个问题通常被称为“子集和”或“背包问题”的变种。下面将详细介绍如何实现这个功能。 首先,我们需要理解基本的组合概念。组合是...

    计算字符串的宽度(width)

    在编程领域,尤其是在UI设计和文本处理中,计算字符串的宽度是一个重要的任务。这涉及到文本渲染,特别是当我们在不同平台上(如Windows、Windows Mobile等)使用不同字体和大小时,需要确保界面布局的准确性和美观...

    用c++写的算出24点的算法

    4. **递归处理子表达式**:对于每种组合,我们递归地处理剩下的三个数字,直到所有数字都被处理完。 在实现时,可以使用字符串来构建和存储表达式,然后使用C++的`std::istringstream`和`std::stod`来解析字符串并...

    结构化程序设计期末答案(代码)

    - 该问题要求我们找出一组未排序数字中出现次数最多的数字,并输出它的长度。我们可以使用哈希表或数组来统计每个数字出现的频率,然后遍历哈希表或数组找出出现次数最多的数字。最后,计算并输出该数字的重复次数...

    ESN转换器 用ESN算出MEID

    ESN是一个16位的数字串,它在CDMA设备上是唯一的,用于识别和追踪设备。然而,随着技术的发展,16位的ESN已经不能满足大量的设备需求,因此引入了32位的MEID。MEID的设计使得它不仅可以替代ESN,还能够兼容GSM和...

    计算字符串宽度

    在计算机图形学和文本处理领域,计算字符串宽度是一项重要的任务,尤其在布局设计、界面开发以及打印输出等场景中。标题“计算字符串宽度”指的就是确定一个字符串在特定字体和大小下占据的屏幕或纸张空间的宽度,...

    练习P20入门版答案

    也许你能用数学办法推出鱼的条数,但我们的要求你编出一个程序,让计算机帮你算出鱼的总数。 16. 试编程找出能被各位数字之和整除的一切两位数。 17. 一个正整数的个位数字是6,如果把个位数字移到首位,所得到的...

    PHP常见字符串操作函数与用法总结

    explode()函数将字符串按照指定的分隔符拆分为数组,例如,可以按照逗号将一串文本拆分成独立的数组元素。implode()(或称为join())函数的作用则相反,它将数组元素重新组合成一个字符串,元素之间可以插入指定的...

    数字逻辑课程设计—“111”序列检测器

    能够运用数字逻辑的理论和方法,把时序逻辑电路设计和组合逻辑电路设计相结合,设计一个有实际应用的数字逻辑电路。 2.使用同步时序逻辑电路的设计方法,设计“1 1 1”序列检测器。写出设计中的5个过程。画出课程...

    二进制串模糊搜索的Java实现0.11

    3. **位翻转**:当两个数据片段在某个位置上的哈希值不同时,SimHash会计算出它们之间的差异,即位翻转的数量。位翻转的数量越小,意味着两段数据越相似。 4. **相似度计算**:通常使用汉明距离(Hamming Distance...

    算24点程序 面向过程与面向对象的C++.txt

    24点游戏是一种数学游戏,玩家需要通过加、减、乘、除四种运算符,将四个随机给出的数字组合成一个结果为24的等式,且每个数字只能使用一次。这个题目不仅考察了数学能力,也考验了逻辑思维和计算技巧。 ### 面向...

    愚蠢的地球人算24源码

    - 创建了一个 `Info` 类型的列表 `cal` 并添加了所有可能的数字组合。 - 尝试将四个文本框中的字符串转换为 `double` 类型的数值。 - 调用 `Shows` 方法来计算是否可以得到24,并根据结果更新界面显示。 #### ...

    蓝桥杯STEMA考试-C++编程专题训练(中级)

    解决这个问题可以使用回溯法或者穷举法,遍历所有可能的百位、十位和个位数字组合,同时确保组合是奇数,即个位为1、3、5、7、9中的一个。对于每个组合,检查其是否满足条件并计数。 第三题:报数模拟 这是一个经典...

    良心出品Python基础总结.doc

    在 Python 程序中,变量是用一个变量名表示,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头,比如:a = 1 变量 a 是一个整数。t_007 = 'T007' 变量 t_007 是一个字符串。 在 Python 中,等号...

    经典算法源代码(for ACM)

    - **稳定婚姻问题O(N^2)**:给出男女两组人群的偏好列表,寻找一种配对方案使得没有一对人更愿意与对方交换配偶。通过一系列的提议和拒绝过程,可以确保找到一个稳定的匹配。 - **拓扑排序**:对于有向无环图而言,...

    算法题集 回溯 递归 分治

    例如,给定一组数字,找出所有可能的k个元素的组合。这同样可以通过回溯算法来实现,即从当前状态出发不断尝试添加新元素直到达到目标数量。 ##### 1.8 售货员的难题 这是一个典型的旅行商问题(TSP),售货员需要...

    易语言算24

    3. **算24**:这是游戏的主要玩法,用户需要对系统给出的四个随机数字进行运算,目标是得到结果为24。这需要用户灵活运用加、减、乘、除以及括号等运算规则。 4. **编辑框调整**:在游戏界面中,编辑框通常用于用户...

    大厂面试系列二.pdf

    在给定的11个点的情况下,找出所有可能的三角形数量,需要使用组合数学来计算,即从11个点中任选3点组成三角形的所有可能组合。 在讨论gets函数在字符数组输入时越界导致程序崩溃的问题时,涉及到对C语言标准库函数...

    凯立德3157专用算号器.rar

    每个激活码都是基于特定算法计算出的一串唯一数字和字母组合,与软件本身以及用户的注册信息相关联。凯立德公司为了保护其知识产权,也会采用类似的方式,要求用户购买产品后输入正确的激活码才能使用全部功能。 ...

    2014c语言必做题

    - 描述:给出一个不多于5位的正整数,要求: - 求出它是几位数; - 分别输出每一位数字; - 按逆序输出每位数字,例如原数为321,应输出123。 - 关键知识点: - 输入输出操作:使用`scanf`接收整数,使用`...

Global site tag (gtag.js) - Google Analytics