Javascript算法:这个组合中有大量的1-9位不重复的n位数字。
具体的主题是:从1 - 9中选择n个数字,以形成不重复的n位数字,并将它们从小到大编号。当输入任意数m时,我们可以找出相应的数。
数,例如n=3,m=213。输出:{ 123(1)、132(2)、213(3)、231(4)、312(5)、321(6)}=x=2。
首先,请参阅主题思想是产生一个从大到小全的数组,然后遍历数组中对应的数字(1,或数组下标)产生推动一个大的数组,然后决定是否接受目前的数量,如果需要编号的数组的长度,一点比以前好的是计算后浪费时间。发电本身的复杂度不高。如果把它扩展到16进制甚至36二进制系统,这将对大量的数据造成不良影响,并且需要浪费部分空间来保存无法使用的数据。
我们的第一个理想化的话题,如果我们给一个数n,则M是由N N位(例如,n = 4,则M是由1234个数字,而不是其他1349或其他组合)。这是因为我们想解决问题的方法简化共性条件的分析,也可以从随机的情况下成为一个理想的情况并不难,这是远远不够的。比如第一个分析主题,{ 123(1),132(2),213(3),231(4),312(5),321(6)} 213第三,第一个数字是2,也就是说第一个数字是1在他面前(123132)。让我们来看看第二数字和数13的组合后,1的第一封信是最小的,在他面前不可能有任何号码,和第三个3号就不用看了,因为如果确定了前面的数字,最后一个是只有一个可能性,它是在前面的2的213的结果(一)+ 0(2)+ 0(尾)= 2个数,也就是说在第三号,比较答案是真的,其他的是相同的数量。可以得出结论,我们需要一个函数(这是本集都()下面的代码),它可以计算一点小于当前数的总比特数,然后加上1是预期的结果。参见代码实现。
函数:每一个,如果它是当前的总数以外的可能性不大。
当前序列号(从小到大)
当前n个数字的总数
功能获得(a,n){
var总和= 1; /总数
对于(var i = n;i 1;i;;和(和)i;)n命令计算的总位置的可能性n不同的数字
返回金额* / N(A-1); / /比先计算可能性小的总人数
}
要计算的数字序列
存储当前位在其位位数和大小上的数目。
例如,213 / /一个数组{ 2,1,1 };一个{ 0 } 2 213 213第一2三排名第二;和{ 1 } 1因为在13 13 1第一排第一
函数查找(m){
m =(m)();数组上的拆分数很容易计算。
创建一个新数组(m.length + 1),加入(1)。分裂(); / /快速生成长度为m的值的长度为1的数组,数组函数描述函数头注释
对于(var i = 0;i < m.length-1;i++){
对于(var j = i + 1;J < m.length;j++){
如果(+),+ { + };
}
数组
console.log(阵列:
为(i = 1,总和= 1;i < m.length;i++){
总和+ = getAll(+ {·},m.length-i + 1); / /联合循环称为获得计算各有以下数比小电流组合的可能性
}
在++位的完整排列中返回m + ;
}
console.log(发现(213)); / /输出3
console.log(发现(123)); / /输出1
console.log(发现(231)); / /输出4
console.log(发现(312)); / /输出5
console.log(发现(4321)); / /输出24
console.log(发现(21)); / /输出2
console.log(发现(1)); / /输出1