给定参数n,从1到n会有n个整数:1,2,3,...,n,
这n个数字共有n!种排列.
按大小顺序升序列出所有排列的情况,并一一标记,
当n=3时,所有排列如下:
"123" "132" "213" "231" "312" "321"
给定n和k,返回第k个排列.
输入描述:
输入两行,第一行为n,第二行为k,
给定n的范围是[1,9],给定k的范围是[1,n!]。
输出描述:
输出排在第k位置的数字。
实例1:
输入:
3
3
输出:
213
说明
3的排列有123,132,213...,那么第三位置就是213
实例2:
输入
2
2
输出:
21
说明
2的排列有12,21,那么第二位置的为21
import java.util.*;
public class Main {
static List<List<Integer>> result = new ArrayList<List<Integer>>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
LinkedList<Integer> track = new LinkedList<>();
boolean[] used = new boolean[m + 1];
backTrace(track, used, m);
if (n <= result.size() && n > 0) {
List<Integer> list = result.get(n - 1);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
System.out.println(sb);
} else {
System.out.println(-1);
}
}
static void backTrace(LinkedList<Integer> track, boolean[] used, int m) {
if (track.size() == m) {
result.add(new LinkedList(track));
return;
}
for (int i = 1; i <= m; i++) {
if (used[i]) {
continue;
}
track.add(i);
used[i] = true;
backTrace(track, used, m);
track.removeLast();
used[i] = false;
}
}
}