43 贪心算法 -第K个排列
2023-12-13 18:18:21
题 目 描 述
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);
}
}
}
文章来源:https://blog.csdn.net/u012545581/article/details/134975043
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!