/*
* 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