n位组成12...n的string,求出第k个排列
变动最高位时,中间间隔的递增数列是最多,根据k的大小,划分变动的位次关系
举个栗子:
123456789 ->213456789 这之间间隔了8!=40320个排列
123456789->312456789 这之间间隔了2*8!个排列 变动一位后,除变动后的最高位,其余排序
此时可列出代码
class Solution
{
public:
string getPermutation(int n, int k)
{
int m=1;
string s="";
for(int i=0;i<n;++i)
{
s+=(m+'0');
m++;
}
int swapNum;
k--;
// int _add[]={1,2,6,24,120,720,5040,40320};
if(k>=40320)
{
swapNum=k/40320;
k=k%40320;
swap(&s[s.size()-9],&s[s.size()-9+swapNum]);
sort(&s[s.size()-8],&s[s.size()-8]+8);
}
if(k>=5040)
{
swapNum=k/5040;
k=k%5040;
swap(&s[s.size()-8],&s[s.size()-8+swapNum]);
sort(&s[s.size()-7],&s[s.size()-7]+7);
}
if(k>=720)
{
swapNum=k/720;
k=k%720;
swap(&s[s.size()-7],&s[s.size()-7+swapNum]);
sort(&s[s.size()-6],&s[s.size()-6]+6);
}
if(k>=120)
{
swapNum=k/120;
k=k%120;
swap(&s[s.size()-6],&s[s.size()-6+swapNum]);
sort(&s[s.size()-5],&s[s.size()-5]+5);
}
if(k>=24)
{
swapNum=k/24;
k=k%24;
swap(&s[s.size()-5],&s[s.size()-5+swapNum]);
sort(&s[s.size()-4],&s[s.size()-4]+4);
}
if(k>=6)
{
swapNum=k/6;
k=k%6;
swap(&s[s.size()-4],&s[s.size()-4+swapNum]);
sort(&s[s.size()-3],&s[s.size()-3]+3);
}
if(k>=2)
{
swapNum=k/2;
k=k%2;
swap(&s[s.size()-3],&s[s.size()-3+swapNum]);
sort(&s[s.size()-2],&s[s.size()-2]+2);
}
if(k>=1)
{
swap(&s[s.size()-2],&s[s.size()-2+1]);
}
return s;
}
void swap(char* a,char* b)
{
char temp=*a;
*a=*b;
*b=temp;
}
};