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


Posted in Javascript onJuly 21, 2012

具体题目是这样的:

从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等其它组合)。之所以这么做是因为我们要简化条件好分析出共性得到解题的方法,而且要从随机的情况转化成理想的情况也不难,本文就不??铝恕O确治鱿绿饽扛?睦?樱?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
Javascript 相关文章推荐
IE8 浏览器Cookie的处理
Jan 31 Javascript
js post方式传递提交的实现代码
May 31 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
Nov 15 Javascript
js字符串完全替换函数分享
Dec 03 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 Javascript
js实现不提示直接关闭网页窗口
Mar 30 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
Apr 30 Javascript
vue-router的两种模式的区别
May 30 Javascript
Nuxt的路由配置和参数传递方式
Nov 06 Javascript
Javascript中找到子元素在父元素内相对位置的代码
Jul 21 #Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 #Javascript
基于jquery的可多选的下拉列表框
Jul 20 #Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
Jul 20 #Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 #Javascript
基于jquery的图片轮播 tab切换组件
Jul 19 #Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
Jul 17 #Javascript
You might like
PHP 程序员的调试技术小结
2009/11/15 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
js实现移动端轮播图
2020/12/21 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
python实现探测socket和web服务示例
2014/03/28 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
python如何使用unittest测试接口
2018/04/04 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
银行职员个人的工作自我评价
2014/02/15 职场文书
交通文明倡议书
2014/05/16 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript