假如有abc,共有3!的排列结果,
排列顺序是 abc acb bac bca cab cba
给任意数字,比如N=4,就要输出bca。
现在有26英文字母,共26!种排列方式,给任意数字N,该如何求出字母列?
听别人说用递归就可以解决,但实在想不出什么解法
假如有abc,共有3!的排列结果,
排列顺序是 abc acb bac bca cab cba
给任意数字,比如N=4,就要输出bca。
现在有26英文字母,共26!种排列方式,给任意数字N,该如何求出字母列?
听别人说用递归就可以解决,但实在想不出什么解法
递归是能解决,这么说吧,递归的思想就是将大问题化作小问题,那么这个问题怎么来划分呢?就以 abcd 为例子看一下。
因为排列结果共有 4!种,并且由于是顺序,那么:
所以,假设 N = 9,那么根据上面的过程,第一位如果是 a,那么其余位共有 3! 种可能,由于 3! < 9,那么第一位必然不是 a,所以要递增一位,改为 b,加上之前 a 的组合数,3!+ 3!> 9,所以无论最后的排列是什么,这个排列的第一位肯定是 b,之后问题求解规模就缩小了,相当于在 acd 三个字母中的,求当 N = 3 的排列结果,直到你找到所有位的字母(也就是 N = 0 的时候)。
转化的过程大概是这样的(*代表未知字母):
如有错误,还望指正,大神轻喷
有意思,一看题目我想到的就是先把排列全部算一遍组成一个数组,然后任意数字N直接从这个数组里面索引出来就是结果了。
我目前的思路是如果规律固定即abc acb bac bca cab cba的话,把26个字母拆分成数组,每个位的字母在相应数字下应该有个算法可以得出位移目标,但是具体算法还得抽空想想,实现了再追答
hfhan 已经给出实现算法,很赞
https://blog.csdn.net/u010271...
这个例子中的result就是最后放结果的数组,顺序有问题的话,直接调用一下sort()方法,就是按照字母顺序排列的数组了。
然后index访问result数组就是想要的结果。
10 回答11.2k 阅读
15 回答8.1k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
8 回答5.9k 阅读
2 回答2.7k 阅读✓ 已解决
3 回答2k 阅读✓ 已解决