javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号_javascript技巧

具体题目是这样的:

  从1--9中选取N个数字,组成不重复的N位数,从小到大进行编号,当输入其中任何一个数M时,能找出该数字对应

的编号。如 N=3,M=213. 输出:[123(1) , 132(2) , 213(3) , 231(4) , 312(5) , 321(6)]--->X=2

  首先看到题目想到的是生成一个从少到大的全排列的数组,然后再遍历数组得到对应的序号(数组下标加1),又或者想到一个个从小到大的生成push进数组,然后判断该数是不是当前题目给的数,如果是的话要求的序号就是当前数组的长度,比前面好的一点的是不用浪费时间去计算生成后面的项。生成本身复杂度不高,如果扩展到16进制甚至36进制且给一个很大的数的话就不好了,还有需要浪费一部分空间去保存用不上的数据。或许我们可以尝试其它不用生成的方法。

  我们先理想化下题目,如果给了一个数N,那么,M就由1-N N位数组成(比如N=4,那M就由1234几个数字组合,而不是其它1349等其它组合)。之所以这么做是因为我们要简化条件好分析出共性得到解题的方法,而且要从随机的情况转化成理想的情况也不难,本文就不啰嗦了。先分析下题目给的例子,[123(1) , 132(2) , 213(3) , 231(4) , 312(5) , 321(6)] 213在第三位,首数字是2,也就是说首数字是1的都在他前面(123,132),再来看第二个数字和后面的数的组合13,首字母1已经是最小的了,他前面不可能有任何数,而第三个数字3就不用看了,因为如果前面的位数都确定了,最后一位就只有一种可能了,得出来的结果就是213的前面有2(首位)+0(二位)+0(尾位)=2个数,也就是说当前数在第3位,对比一下答案确实是这样的,其它数的分析也一样。由此可以得出我们要一个函数(也就是下面代码的setAll())可以算出某一位比当前数小的可能性总数,然后累加起来+1就是想要的结果,请看代码实现:

复制代码 代码如下:

//函数功能:得到每一位,如果是其它数的话比当前小的可能性总数
//a 当前数序号(从小到大)
//n 当前数总数
function getAll(a,n){
var sum=1; //总数
for(var i=n;i>1;i--)sum=sum*i; //算出n个有序的位置放n个不同的数字的可能性总数
return sum*(a-1)/n; //算出比首位为a的比当前数小的数的可能性总数
}

//m 要计算的数序列
//a 存放当前位的数在和它后位的数而组成的数它的大小序号
// 比如 213 的 a数组为 [2,1,1]; a[0]为2是因为 213 首位2在213三个数字中排第2小;而a[1]为1是因为13的首位1在13中排第一小
function find(m){
m=(m+"").split(""); //把当前数拆分放在数组里面好方便对每一位进行计算
var a=new Array(m.length+1).join(1).split(""); //快速生成长度为m的长度的值都为1的数组,a数组的功能说明看上面函数头的注释
for(var i=0;i<m.length-1;i++){
for(var j=i+1;j<m.length;j++){
if(+m[i]>+m[j])a[i]++;
}
} //生成a数组
console.log("a数组:",a);
for(i=1,sum=1;i<m.length;i++){
sum+=getAll(+a[i-1],m.length-i+1); //循环调用getAll计算每一位与其后面的数成的组合比当前组合小的可能性总数
}
return m+" 排在全排列的第"+sum+"位";
}
console.log(find(213)); //输出3
console.log(find(123)); //输出1
console.log(find(231)); //输出4
console.log(find(312)); //输出5
console.log(find(4321)); //输出24
console.log(find(21)); //输出2
console.log(find(1)); //输出1

时间: 2024-10-31 10:25:56

javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号_javascript技巧的相关文章

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),又或者想到一个个从小到大的生成push进数组,然后判断该数是不是当前题目给的数,如果是的话要求的序号就是当前数

算法题:HDU 2594 Simpsons’ Hidden Talents(KMP)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2594 题目大意: 给两个字符串s1和s2, 求出是s1的前缀并且是s2的后缀的最长的字符串. 分析与总结: 真正理解好KMP算法,这题就是水题. 首先求出s1的失配函数,然后在s2中 寻找s1字符串. 在寻找字符串过程中,会有一个状态值j,这个值表示的是当前在s2中已经匹配 了多少个s1的字符. 所以,全部匹配完后,最后j的值就是以s2的最后一个字符结尾,和s1的前缀相匹 配的最长字符串.也就是所求的

算法题:uva 10318

题目链接: 首先,可以确定每个格子只能选一次,因为选任何大于0的偶数次,等于没有效果 一样. 然后,就可以把这题理解成从r*c的矩阵中选择一些格子进行"点亮"操作,使得最终所 有格子都是"亮"的状态.那么,每个格子要么有点亮操作,要么没有,总共复杂度为2^25,显然必须 进行减枝. 假设从第一行第一列开始,从左往右,从上往下一次依次选择,对于当前所在位置( x, y),它已经不能影响到x-2以前的行数了,所以当到x行时,如果第x-2行没有全部点亮,则进行减枝 . 此

求一个面试算法题答案。

问题描述 求一个面试算法题答案. 已知函数f()以相同的概率返回0或者1,求一个函数g()以相同的概率返回0-7之间的任意一个数字. 解决方案 其实这个题不难,可以考虑用2进制的方式来做.g(){return 4*f()+2*f()+f();} 希望能帮到你. 解决方案二: #includeint g(){srand(time(NULL));ret = rand()%8;return ret;}

一个算法题,求答案啊啊啊啊

问题描述 一个算法题,求答案啊啊啊啊 白班 09:00-18:00 通班 09:00-21:00 每个人每个月通班数量必须等于早中班和中晚班数量之和 早中班 09:00-15:00 中晚班 15:00-21:00 假设:每月按照30计算. 排班规则: 1.每个人每个月固定休息6天连续上班天数不超过7天. 2.每天各班次上班的人数最低需求:8个白班5个通班1个早中班,2个中晚班. 3.每个月每个人的通班天数安排不超过8天. 4.每个人每个月早中班和中晚班的天数之和需要与通班天数相等. 5.每月最多

相交部分-算法题,求某点是否在平行四边形内

问题描述 算法题,求某点是否在平行四边形内 算法题,已知某点的坐标和平行四边形的四个点,求点是否在平行四边形内,用算法如何实现? 解决方案 平面上点在任意多边形内部的计算方法,就是从点所在位置做一个水平或者垂直的射线 计算它和多边形的交点,奇数在内,偶数在外 对于特殊的四边形或者需要精确知道点和多边形之间关系的,有其他的办法 对于楼主的平行四边形的特例,可以使用仿射坐标分解的办法,这个方法在三维系统当中经常被用于碰撞检测里面射线和三角形相交的检测 把点按照平行四边形的两个相邻边分解,得到仿射坐标

算法题。给出一推点的坐标,和入口点,结束点,求出最短路径

问题描述 打个比方,我要去北京,有好多景点,比如A,B,C,D,E,F,每个点都有坐标,1:假设从A开始,D结束,求出一个路线最短的方案.2:假设从A开始,结束点任意,求出一个路线最短的方案. 解决方案 解决方案二:动态规划~我猜是这个.解决方案三:这第一个问题和第二个问题有区别吗,简直一模一样两点间直线距离最短,做一个排序,哪个最短去那个解决方案四:假如说从交通大学出发,天坛公园结束,要走完每一个其他景点,求最短路径.这不是经典的最短路径的题,也不是图的遍历,反正我也不懂,求大神帮忙解决方案五

dp-动态规划(DP)算法求出一个问题的所有解

问题描述 动态规划(DP)算法求出一个问题的所有解 具体问题是: 假设有一个楼梯共有N步,你每次可以爬1步或2步.请编写一个函数来计算,有多少种不同的方法可以爬到顶. 此题给出的解如下: int climbStaris(int n){ if(n <= 1) return 1; if(n == 2) return 2; int p = 1, q = 2, curr; for( int i = 3; i <= n; ++i){ curr = p + q; p = q; q = curr; } re

一个小岛-眼睛的颜色 算法题我的代码为什么不能通过???一个岛上有n个人

问题描述 眼睛的颜色 算法题我的代码为什么不能通过???一个岛上有n个人 一个岛上有n个人,每个人的眼睛要么是蓝色的,要么是黑色的,并且至少有一个人眼睛是蓝色的.每个人都知道至少一个人眼睛是蓝色的事实,但是不知道具体几个人眼睛是蓝色的.每天所有人互相见面,他们可以看到别人的眼睛的颜色,但是看不到自己眼睛的颜色.别人也不能告诉他眼睛的颜色.如果一个人推断出自己的眼睛是蓝色的,他就会在当天离开.求每个人离开在第几天. 输入格式: 多组数据,每组数据第一行是一个正整数n,表示人数.(2<=n<=10