`

告诉你什么是优雅的代码(8)-----排列组合专题

    博客分类:
  • Java
阅读更多
http://www.iteye.com/topic/770382提到:

4.1~20的整数的全排列,因为不才以前也研究过排列组合的问题,于是有了本专题。

最近的专题更多的是在给条鱼人家吃,没有讲怎么捕鱼。所以今天在介绍优雅代码之前,提出一个解决问题的方法论。

复杂问题都是由简单问题组成的,先解决简单问题。

言简意赅,任何复杂问题都是纸老虎。当你面对99*99时,你就要考虑将他变成1+1,然后解决1+1。

有了这个方法论,面对1-20的全排列。你知道怎么做了吧。没错,转变成AB的全排列。

AB:  AB  BA

太简单了,加个“C”吧。

ABC:  ABC ACB BAC BCA CAB CBA

看见标红色的字母了吧,无视它的存在, 就变成了 AB ,BC,AC 的 全排列。

大问题可沿用小问题的解法,让你想到了什么。一个是递归,一个是动态规划。这里显然适合用递归。
假设有n个字符,基本的算法就是:
1.n>2时,变成n-1问题
2.n=2时,输出
3.滚动数组

于是,一个优雅的方案浮出水面:





/**
 * 创建时间:2010-9-25 下午12:22:15
 * 项目名称:Test
 * @author Y.Guo
 * @version 1.0 
 * @since JDK 1.6
 * 文件名称:FullArrange.java
 * 类说明:全排列
 */
public class FullArrange {
	private char[] element;
	private int length;
	public void arrange(char[] element){
		this.element = element;
		this.length = element.length;
		deal(length);
	}
	private void deal(int size){
		if(size == 1)
			return;
		for (int i = 0; i < size; i++) {
			deal(size - 1);
			if(size == 2){
				print();
			}
			rotate(size);
		}
	}
	private void rotate(int size) {
		int firstP = length - size;
		char first = element[firstP];
		int i;
		for (i = firstP + 1; i < length; i++) {
			element[i - 1] = element[i];
		}
		element[i -1] = first;
		
	}
	private void print() {
		for (int i = 0; i < length; i++) {
			System.out.print(element[i]);
		}
		System.out.print("\t");
		
	}

	
	public static void main(String[] args) {
		FullArrange tool = new FullArrange();
		char[] elem = {'1','2','3','4','5'};
		tool.arrange(elem);
	
	}
	
}








至于组合问题,请听下回分解。






14
4
分享到:
评论
5 楼 chinadeng 2010-10-29  
正需要这方面的内容 多谢多谢!!!!!!!!
忘牛人继续写博
4 楼 yangguo 2010-10-10  
tianshiyeben 写道
引用文字:
引用
文字
或者
javaeye 写道
文字
(alt+q)


what the hell are you talking about?
3 楼 tianshiyeben 2010-10-09  
引用文字:
引用
文字
或者
javaeye 写道
文字
(alt+q)
2 楼 yangguo 2010-09-25  
躁动的绵羊 写道
为什么要留言才给代码?为什么不把代码传上来呢?其实大家都想看看代码的解法,楼主就贴上代码吧


免得给那些隐藏癖,新手癖的也跑来看。好吧,我重贴一下。
1 楼 躁动的绵羊 2010-09-25  
为什么要留言才给代码?为什么不把代码传上来呢?其实大家都想看看代码的解法,楼主就贴上代码吧

相关推荐

    Python实现的排列组合计算操作示例

    ### Python实现的排列组合计算操作知识点详解 #### 一、引言 在计算机科学与数学领域,排列与组合是两种非常重要的概念。排列是指从n个不同元素中取出m个元素按照一定的顺序进行排列的方式数量;而组合则是不考虑...

    综合信息网站系统源代码--005

    采用模块化设计,可以任意调用,如:热点排行(能根据页面自动判断分类排行)、导读、焦点、推荐、搜索等,版面可由你自由组合,更多个性化。 可视化新闻添加方式,可以粘贴网页任意图片、表格、文字,就象WORD一样...

    JS实现二维数组元素的排列组合运算简单示例

    在具体实现上,需要了解如何通过JavaScript代码遍历二维数组中的所有元素,并对这些元素进行排列组合运算。通常,这涉及到多层嵌套循环来遍历每一个维度的数组,以及递归函数的使用来处理复杂的组合情况。 示例中所...

    精品专题(2021-2022年收藏)PCBFPCB工程术语.doc

    8. Date Code - 生产日期代码,用于标识产品的生产时间。 9. Delivered Panel (DP) - 为便于后续装配和测试,将多个PCB按照特定布局排列在一个面板上。 10. Double-Side Printed Board - 双面板,具有在两面都有...

    专题资料(2021-2022年收藏)基于单片机8×8点阵控制系统设计.doc

    2. **LED8×8点阵显示屏**:LED点阵是由多个LED灯珠排列组成的矩阵,每个点代表一个LED,8×8点阵意味着有8行8列共64个LED。这种显示屏可以用来显示数字、字母、符号或者简单的图形。通过控制每个LED的亮灭状态,...

    专题资料(2021-2022年)SEO营销规范.ppt

    - 创造多元排列组合,如商务CDMA、电信团购等。 - 利用品牌关键词,如“中国电信”、“天翼”和“HICDMA”。 2. **关键词密度**:保持1%至7%的关键词密度,避免过度优化导致搜索引擎惩罚。 3. **网页设计**: -...

    leetcode递归专题-Pursuit-Core-iOS-DSA-Practice:SwiftDSA练习

    leetcode 递归专题追求-核心-iOS-DSA-实践 Swift 数据结构和算法以及练习。 周 第 1 周:大 O 表示法、递归、排序概述、ADT ...阶乘斐波那契质数最大公约数排列组合几何级数 代码挑战站点 阅读资源

    2020届高考数学二轮复习专题4统计与概率排列与组合算法初步复数第3讲算法初步与复数练习理

    3. **算法初步**:在高中数学中,算法初步主要涉及顺序结构、选择结构和循环结构等基本概念,以及流程图和伪代码的表示。第五题和第六题展示了程序框图,这是算法的一种图形表示形式,用于描述解决问题的步骤。 4. ...

    递归九讲2021 7-9.zip

    《递归九讲2021 7-9》是一个关于递归算法的专题学习资料,涵盖了递归在解决各种问题中的应用,包括二叉树类问题和排列类问题。通过对递归的理解和掌握,我们可以解决更复杂的问题,提高编程效率。本资料包括三章互动...

    枚举专题.docx

    在每次排列变化时,代码会检查三种可能的乘法组合: 1. `a[0]*100+a[1]*10+a[2]`乘以`a[3]`等于原始的四位数`i`。 2. `a[0]`乘以`a[1]*100+a[2]*10+a[3]`等于`i`。 3. `(a[0]*10+a[1])`乘以`(a[2]*10+a[3])`等于`i`...

    数据结构与算法专业课程设计专题计划数学与计算机系信计本科.doc

    2. **车厢调度问题**:这是一个排列组合问题,要求设计程序生成所有可能的4节车厢序列,从1到4编号。 3. **平衡二叉树判定**:给定二叉树的先序或后序遍历结果,判断该树是否为平衡二叉树,即左右子树高度差不超过1...

    数学-省选1

    此外,Pólya计数理论和博弈论也是组合问题中的重要工具,常常用于解决排列组合和概率问题。 5. **概率与期望**:在解决实际问题或设计算法时,概率论和期望值计算是必不可少的。动态规划结合概率可以解决一些复杂...

    搜索专题

    具体来说,DFS 用来寻找所有可能的组合方式,并检查这些组合是否满足最终的目标长度。 - **优化技巧**: - **剪枝**:为了避免不必要的搜索分支,可以采用“剪枝”技术。比如在代码中,对于已经使用过的小棍不再...

    【二轮参考】高优指导2022高三数学(理)二轮复习专题质量评估六 .docx

    - **知识点**: 排列组合、概率计算。 - **实例**: 题目4中通过计算所有可能的基本事件来求解特定概率。 - **解析**: 列出了所有可能的情况,从中筛选符合条件的事件,进而计算概率。 以上内容涵盖了数学与IT领域的...

    ACM/ICPC比赛经验分享及代码程序资源

    组合数学中的排列组合;概率论与统计等。这些数学知识不仅能帮助理解算法背后的原理,还能在解题过程中发挥重要作用。 ##### 2. 团队合作 - **成员分工**:一个优秀的ACM队伍通常由三名成员组成,根据各自的优势和...

    2016年高考数学二轮复习精品资料(江苏版)专题1.9 概率与统计、算法、推理与证明、复数(测试卷) 含解析.doc

    - 伪代码的理解与执行:第九题和第十题给出了伪代码,要求理解并执行算法,计算输出的结果。 - 循环结构的运用:第十一题和第十二题展示了循环结构在程序中的应用,通过循环计算得到输出值。 3. **推理与证明**:...

    php求数组全排列,元素所有组合的方法

    数组全排列是指将数组中的元素按不同顺序重新组合,形成所有可能的排列方式。而元素所有组合则是指从数组中取出任意数量的元素,形成所有可能的组合。本知识点将详细介绍如何用PHP实现这两个功能,同时涵盖数组的...

    动易SiteWeaver版图片频道标签.doc

    - `ShowType`:显示样式,如图片+标题+内容简介的排列方式。 - `ImgWidth`和`ImgHeight`:图片的宽度和高度。 - `TitleLen`:标题的最大字符数,0为不显示,-1为显示完整标题。 - `ContentLen`:内容简介的最大...

Global site tag (gtag.js) - Google Analytics