欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决排列组合题

程序员文章站 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());
	}

}

 

相关标签: XP Windows