1~n(最多n=9即123456789),让你来求第K个全排列。(题中告诉你规律:1234...n的全排列一共有n!个)
大致思路:
举例子找规律的题,见下面这个例子:
以n = 4, k = 17的情况来分析,所有排列组合情况如下:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412 <--- k = 17
3421
4123
4132
4213
4231
4312
4321
可以发现,对于第n位,它连续出现的次数就是它后面n-1个数的排列方案总数即(n-1)!个。
于是,通过k/(n-1)!和k%(n-1)!就能来做了。阶乘开一个数组来存吧。然后要注意k是从1开始的,而从字符串中取某一位是从0开始的,所以要首先k-=1。(这个举n=1,k=1的例子可知)
这里我觉得很subtle的就是string的push_back用法和erase用法,我还以为只有vector有嘞,string真厉害:
- string.push_back(str) 直接在本身新增字符串
- string.erase(i,n) 删除string[i]开始的n个字符
AC代码:
class Solution {
public:
string getPermutation(int n, int k) {
int f[1000]; //f[i]=i!
string res;
string nn = "123456789";
f[0]=1;
for(int i=1;i<=1000;i++)
f[i] = f[i-1] * i; //求阶乘
k--;
for(int i=1;i<=n;i++) //n位数
{
int a = k/f[n-i];
k = k%f[n-i];
res.push_back(nn[a]);
nn.erase(a,1);
}
return res;
}
};