方法一:
package fenxiang;
import java.util.ArrayList;
import java.util.Scanner;
public class quanPaiLie {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String str="";
for (int i = 1; i <=n; i++) {
str+=String.valueOf(i);//123
}
ArrayList<String> arr=new ArrayList<String>();//1 2 12 21
arr.add(String.valueOf(str.charAt(0)));//1
// String first=String.valueOf(str.charAt(0));//1
for (int i = 1; i < str.length(); i++) {
//临时集合,用来临时数据
ArrayList<String> tempList=new ArrayList<>();
//取其它字符
String other=str.charAt(i)+"";//3
for (String s : arr) {//{21,12} 第一次取:21 第二次取12
//加在前面
String newStr=other+s; //312
tempList.add(newStr);//
//加在后面
newStr=s+other;// 123
tempList.add(newStr);//
//数字插到中间 1 2 3:1423,1243
for (int j = 1; j <s.length(); j++) {
//1 2 4 3
newStr=s.substring(0,j)+other+s.substring(j);
tempList.add(newStr);//{321,213,231,312,123,132}
}
}
arr=tempList; //arr={1}被替换为{12,21} {321,213,231,312,123,132}
}
System.out.println(arr);
}
}
法二:
package fenxiang;
import java.util.ArrayList;
import java.util.Arrays;
public class demo2 {
public static void main(String[] args) {
int []z= {1,2,3};
//临时集合
ArrayList<Integer>templist=new ArrayList<Integer>();
//总集合
ArrayList<ArrayList<Integer>>list=new ArrayList<ArrayList<Integer>>();
//记录状态
boolean []pd=new boolean [z.length];
f(z,templist,list,pd);
System.out.println(list);
}
public static void f(int []z,ArrayList<Integer>templist,ArrayList<ArrayList<Integer>>list,boolean[]pd) {
if(templist.size()==z.length) {
list.add(new ArrayList (templist));
return;
}
for(int i=0;i<z.length;i++) {
if(pd[i]) { //每次判断之前的数字有没有被使用,被使用就跳过
continue;
}
templist.add(z[i]);
pd[i]=true;
f(z,templist,list,pd);
templist.remove(templist.size()-1);
pd[i]=false;
}
}
}