Skip to content

Commit b342f5e

Browse files
committed
feat: add question 60
1 parent 5fea662 commit b342f5e

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

60.第k个排列.js

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* @lc app=leetcode.cn id=60 lang=javascript
3+
*
4+
* [60] 第k个排列
5+
*
6+
* 1. 根据数学计算, 直接推断每个位置的数字, 将待用数字存到数组中
7+
* 2. 对于位置 i, 后 i - 1 位有 i - 1 的阶乘种可能, 用 k / 阶乘数, 并向上取整, 可以得到目前处于第几轮阶乘
8+
* 3. 第几轮阶乘即用到了第几位的数字, 从待用数组中取出数字, 并存到结果中
9+
* 4. 然后将 k 减去 当前轮数 * 阶乘数, 则得到下一位的 k 值, 重复 2~3 即可
10+
*/
11+
12+
// @lc code=start
13+
/**
14+
* @param {number} n
15+
* @param {number} k
16+
* @return {string}
17+
*/
18+
var getPermutation = function(n, k) {
19+
const factorial = [0, 1];
20+
for (let i = 2; i < 10; i++) {
21+
factorial[i] = factorial[i - 1] * i;
22+
}
23+
24+
const arr = [];
25+
for (let i = 0; i < n; i++) {
26+
arr[i] = i + 1;
27+
}
28+
29+
const result = [];
30+
while (arr.length > 1) {
31+
const fac = factorial[arr.length - 1];
32+
const index = Math.ceil(k / fac);
33+
result.push(...arr.splice(index - 1, 1))
34+
k -= fac * index;
35+
}
36+
37+
result.push(arr[0]);
38+
39+
return result.join('');
40+
};
41+
// @lc code=end

0 commit comments

Comments
 (0)