题 目 描 述

n  个 字 共 有 n ! 种 排 列 。

给 定 参 数 n , 从 1 到 n 会 有 n 个 整 数 : 123

按 大 小 顺 升 序 列 出 所 有 排 列 的 情 况 ,

并 己 当 n = 3 时 ,

所 有 排 列 如 下 : “ 123 ” “ 132 ” “ 213 ” “ 231 ” “ 312 , “ 321 ”

给 定 n 和 k , 返 回 第 k 价 葬 列 。

输 入 描 述 ,

第 一 行 为 n ,

第 二 行 为 k , 给 定 n 的 范 围 是 [ 1 , 9 ] 给 定 k 的 范 围 是 [ 1 ,n 刂 。

输 出 描 述

输 出 排 在 k 位 首 的 数 字 。

import java.util.Arrays;

import java.util.Scanner;

public class Main {

static int[] fact;

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int k = sc.nextInt();

fact = new int[n + 1];

fact[1] = 1;

for (int i = 2; i <= n; i++) {

fact[i] = fact[i - 1] * i;

}

int[] arr = new int[n];

for (int i = 0; i < n; i++) arr[i] = i + 1;

System.out.println(getNK(n, k, arr));

}

public static String getNK(int n, int k, int[] arr) {

if (n == 1) return "1";

int f = fact[n - 1];

int prefix = arr[(k - 1) / f];

k %= f;

k = k == 0 ? f : k;

arr = Arrays.stream(arr).filter(ele -> ele != prefix).toArray();

if (k == 1) {

StringBuilder sb = new StringBuilder();

for (int v : arr) sb.append(v);

return prefix + sb.toString();

} else {

return prefix + getNK(n - 1, k, arr);

}

}

}

相关阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。