解决排列组合题
程序员文章站
2022-04-28 12:44:15
...
据说有这样的一道排列组合试题,拿出来就当做做练习,来个痕迹保留......
/**
*如题: 给定六个数字:1、2、3、3、5、6,试求出满足下述要求的,用这六个数字组成的6位数的个数:
* 1) 两个数字3不能相邻,例如653321不允许
* 2) 数字5不能在第5位,例如132356不允许
*/
import java.util.*;
/**
* windows XP
* @author zxb
* @date 2009-07-09
* java version "1.4.2_09"
*/
public class ArrangeTest {
private ArrayList arrangeList = new ArrayList();
public ArrangeTest() {
}
private void swapData(String list[], int k, int i) {
String temp = list[k];
list[k] = list[i];
list[i] = temp;
}
public void genernateData(String list[], int k, int m) {
if (k > m) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i <= m; i++) {
sb.append(list[i]);
}
arrangeList.add(sb.toString());
} else {
for (int i = k; i <= m; i++) {
swapData(list, k, i);
genernateData(list, k + 1, m);
swapData(list, k, i);
}
}
}
public ArrayList filterNum() {// 过滤掉5在索引位置为4的 和 33不能相邻的数字
ArrayList l = new ArrayList();
Iterator it = arrangeList.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// 过滤掉5在索引位置为4的 和 33不能相邻的数字
if (string.indexOf("5") != 4 && string.indexOf("33") < 0) {
l.add(string);
}
}
return l;
}
public static void main(String args[]) {
String arr[] = { "1", "2", "3", "3", "5", "6" };
ArrangeTest ts = new ArrangeTest();
ts.genernateData(arr, 0, arr.length - 1);
ArrayList l = ts.filterNum();
for (int i = 0; i < l.size(); i++) {
System.out.println(l.get(i));
}
System.out.println("总个数====" + l.size());
}
}
上一篇: 别人动手能力怎么这么好呢