m个字符的n个字符排列

/*
 * 1~9个数中的n位数全排列
 */
import java.util.ArrayList;
import java.util.List;

public class T05 {
	static int count = 0;	// 总个数
	/**
	 * 全排列
	 * @param lis	记录组合
	 * @param start	为0~9(lis所用的下标)
	 * @param end	为9
	 */
	public static void f(List<Integer> lis,int start){
		if(start>=lis.size()){
			System.out.println(lis);	// 输出排列组合
			count++;	// 计数
			return ;
		}
		for(int i=1;i<=9;i++){
			if(!lis.contains(i)){
				lis.set(start, i);	// 修改元素
			}else{
				continue;
			}
			f(lis,start+1);	// 递归修改每个元素
			lis.set(start, -1);	// 还原
		}
	}
	public static void main(String[] args){
		int n = 5;	// 1~9个数中选5个全排列
		List<Integer> lis = new ArrayList<Integer>();
		for(int i=0;i<n;i++){	// 初始化lis长度
			lis.add(-1);
		}
		f(lis,0);	// 全排列
		System.out.println("总个数:"+count);
	}
}
运行结果:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 6]
[1, 2, 3, 4, 7]
[1, 2, 3, 4, 8]
[1, 2, 3, 4, 9]
[1, 2, 3, 5, 4]

...............

...............

...............

[9, 8, 7, 5, 6]
[9, 8, 7, 6, 1]
[9, 8, 7, 6, 2]
[9, 8, 7, 6, 3]
[9, 8, 7, 6, 4]
[9, 8, 7, 6, 5]
总个数:15120

=====================================华丽分隔线=====================================

方法二:对以上程序的 (数字排列)扩展为(字符排列)看下程序:

import java.util.ArrayList;
import java.util.List;

public class T13 {
	static int count = 0;	// 记录个数
	// m排n全排列
	public static void f(List<Character> lis,char[] c,int n){
		if(n==0){
			count++;	// 记录个数
			System.out.println(lis);	// 输出
			return ;
		}
		for(int i=0;i<c.length;i++){
			if(!lis.contains(c[i])){	// 不包含,则添加
				lis.set(lis.size()-n, c[i]);
			}else{	// 否则跳过
				continue;
			}
			f(lis,c,n-1);	// 递归
			lis.set(lis.size()-n, '0');	// 还原
		}
	}
	public static void main(String[] args) {
		long star = System.currentTimeMillis();
		int n = 3;	// 任选n个字符的排列组合
		char[] c = "123456789".toCharArray();	// 要排列的字符
		List<Character> lis = new ArrayList<Character>();
		for(int i=0;i<n;i++){
			lis.add('0');	// 初始化 lis 的长度
		}
		f(lis,c,n);	// 进入全排列
		System.out.println("排列个数:"+count);
		System.out.println("花费时间:"+(System.currentTimeMillis()-star)+"毫秒");
	}
}
运行结果:
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 2, 6]
[1, 2, 7]
[1, 2, 8]
[1, 2, 9]
[1, 3, 2]

.........

.........

.........

[9, 7, 8]
[9, 8, 1]
[9, 8, 2]
[9, 8, 3]
[9, 8, 4]
[9, 8, 5]
[9, 8, 6]
[9, 8, 7]
排列个数:504
花费时间:19毫秒


=====================================华丽分隔线=====================================

方法三:

/*
 * m个字符的n个字符排列
 */
import java.util.ArrayList;
import java.util.List;
 
public class m个字符的n个字符排列 {
    private static char[] is = new char[] { '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    private static int total;
    private static int m = 4;
	private void plzh(String s, List<Integer> iL, int m) {
        if(m == 0) {
            System.out.println(s);
            total++;
            return;
        }
        List<Integer> iL2;
        for(int i = 0; i < is.length; i++) {
            iL2 = new ArrayList<Integer>();
            iL2.addAll(iL);
            if(!iL.contains(i)) {
                String str = s + is[i];
                iL2.add(i);
                plzh(str, iL2, m-1);
            }
        }
    }
    public static void main(String[] args) {
        List<Integer> iL = new ArrayList<Integer>();
        new m个字符的n个字符排列().plzh("", iL,  m);
        System.out.println("total : " + total);
    }
}
运行结果:
1234
1235
1236
1237
1238
1239
1243

....

....

....

9867
9871
9872
9873
9874
9875
9876
total : 3024


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值