全排列
经常遇到数字全排列问题,但是java不像c++和python一样有专门全排列的函数,所以说特麻烦,后面借鉴了一下下别人的java全排列。我觉得还挺好理解和推算的。
import java.util.HashSet;
import java.util.Scanner;
public class FullArrange {
/*
* @Author YanYiQi
* @Description
* @Date 2022/3/29
* HashSet :使用哈希set存储排列的数字,顺便起到查重的作用。
* m:表示数字长度
* cnt:用来存放数字为 i 的数有多少个
*/
static HashSet<Integer> set = new HashSet<>();
static int m;
static int[] cnts = new int[10];
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int num = s.nextInt();
while(num != 0){
cnts[num%10]++;
num /=10;
m++;
}
dfs(0,0);
ArrayList<Integer> list = new ArrayList<>(set);
for (int n:list) {
System.out.print(n + " ");
}
}
static void dfs(int u,int cur){
if(u == m){
set.add(cur);//长度到达值时加入set中
return;
}
for (int i = 0; i <10; i++) {
if(cnts[i] != 0){
cnts[i]--;
if(i != 0 || cur != 0){
dfs(u+1,cur*10+i);//递归调用下去
}
cnts[i]++;//回溯原状态
}
}
}
}
运行结果如下,因为set无序嘛,所以输出的就没顺序,但是找的时候直接转成list找。