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);
}
}
至于组合问题,请听下回分解。
分享到:
相关推荐
### Python实现的排列组合计算操作知识点详解 #### 一、引言 在计算机科学与数学领域,排列与组合是两种非常重要的概念。排列是指从n个不同元素中取出m个元素按照一定的顺序进行排列的方式数量;而组合则是不考虑...
采用模块化设计,可以任意调用,如:热点排行(能根据页面自动判断分类排行)、导读、焦点、推荐、搜索等,版面可由你自由组合,更多个性化。 可视化新闻添加方式,可以粘贴网页任意图片、表格、文字,就象WORD一样...
在具体实现上,需要了解如何通过JavaScript代码遍历二维数组中的所有元素,并对这些元素进行排列组合运算。通常,这涉及到多层嵌套循环来遍历每一个维度的数组,以及递归函数的使用来处理复杂的组合情况。 示例中所...
8. Date Code - 生产日期代码,用于标识产品的生产时间。 9. Delivered Panel (DP) - 为便于后续装配和测试,将多个PCB按照特定布局排列在一个面板上。 10. Double-Side Printed Board - 双面板,具有在两面都有...
2. **LED8×8点阵显示屏**:LED点阵是由多个LED灯珠排列组成的矩阵,每个点代表一个LED,8×8点阵意味着有8行8列共64个LED。这种显示屏可以用来显示数字、字母、符号或者简单的图形。通过控制每个LED的亮灭状态,...
- 创造多元排列组合,如商务CDMA、电信团购等。 - 利用品牌关键词,如“中国电信”、“天翼”和“HICDMA”。 2. **关键词密度**:保持1%至7%的关键词密度,避免过度优化导致搜索引擎惩罚。 3. **网页设计**: -...
leetcode 递归专题追求-核心-iOS-DSA-实践 Swift 数据结构和算法以及练习。 周 第 1 周:大 O 表示法、递归、排序概述、ADT ...阶乘斐波那契质数最大公约数排列组合几何级数 代码挑战站点 阅读资源
3. **算法初步**:在高中数学中,算法初步主要涉及顺序结构、选择结构和循环结构等基本概念,以及流程图和伪代码的表示。第五题和第六题展示了程序框图,这是算法的一种图形表示形式,用于描述解决问题的步骤。 4. ...
《递归九讲2021 7-9》是一个关于递归算法的专题学习资料,涵盖了递归在解决各种问题中的应用,包括二叉树类问题和排列类问题。通过对递归的理解和掌握,我们可以解决更复杂的问题,提高编程效率。本资料包括三章互动...
在每次排列变化时,代码会检查三种可能的乘法组合: 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`...
2. **车厢调度问题**:这是一个排列组合问题,要求设计程序生成所有可能的4节车厢序列,从1到4编号。 3. **平衡二叉树判定**:给定二叉树的先序或后序遍历结果,判断该树是否为平衡二叉树,即左右子树高度差不超过1...
此外,Pólya计数理论和博弈论也是组合问题中的重要工具,常常用于解决排列组合和概率问题。 5. **概率与期望**:在解决实际问题或设计算法时,概率论和期望值计算是必不可少的。动态规划结合概率可以解决一些复杂...
具体来说,DFS 用来寻找所有可能的组合方式,并检查这些组合是否满足最终的目标长度。 - **优化技巧**: - **剪枝**:为了避免不必要的搜索分支,可以采用“剪枝”技术。比如在代码中,对于已经使用过的小棍不再...
- **知识点**: 排列组合、概率计算。 - **实例**: 题目4中通过计算所有可能的基本事件来求解特定概率。 - **解析**: 列出了所有可能的情况,从中筛选符合条件的事件,进而计算概率。 以上内容涵盖了数学与IT领域的...
组合数学中的排列组合;概率论与统计等。这些数学知识不仅能帮助理解算法背后的原理,还能在解题过程中发挥重要作用。 ##### 2. 团队合作 - **成员分工**:一个优秀的ACM队伍通常由三名成员组成,根据各自的优势和...
- 伪代码的理解与执行:第九题和第十题给出了伪代码,要求理解并执行算法,计算输出的结果。 - 循环结构的运用:第十一题和第十二题展示了循环结构在程序中的应用,通过循环计算得到输出值。 3. **推理与证明**:...
数组全排列是指将数组中的元素按不同顺序重新组合,形成所有可能的排列方式。而元素所有组合则是指从数组中取出任意数量的元素,形成所有可能的组合。本知识点将详细介绍如何用PHP实现这两个功能,同时涵盖数组的...
- `ShowType`:显示样式,如图片+标题+内容简介的排列方式。 - `ImgWidth`和`ImgHeight`:图片的宽度和高度。 - `TitleLen`:标题的最大字符数,0为不显示,-1为显示完整标题。 - `ContentLen`:内容简介的最大...