思想:给定数字n和k后,则(n-1)!表示最高一位固定时可表示的排列的种数,例如,当n=3时:
“123”
“132”
“213”
“231”
“312”
“321”
最高位分别为1,2,3,时都对应两种排列情况。,当k=1、2时,最高位为1;当k=3、4时,最高位为2;当k=5、6时,最高位为3。由规律可知,最高位=(k-1)/(n-1)!+1。
第二位第三位依次类推。
下面给出C++代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
string getPermutation(int n, int k) {
vector<int> v(n,1);
string res;
for (int i=0;i<n;++i)
{
v[i] = i+1;
}
while(n)
{
int tmp = fac(n-1);
int ind = (k-1)/tmp;
res += char(v[ind] + '0');
--n;
//将元素v[i]从v中去除
for (int i=ind;i<n;++i)
{
v[i] = v[i+1];
}
v.pop_back();
k -= ind*tmp;
}
return res;
}
//求n的阶乘
int fac(int n)
{
int res = 1;
for (int i=1;i<=n;++i)
{
res *= i;
}
return res;
}
};
int main()
{
Solution s;
cout<<s.getPermutation(4,8)<<endl;
return 0;
}