[LeetCode.60]第k个排列

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;
	}
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值