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


Posted in Javascript onApril 01, 2015

具体题目是这样的:

从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确治鱿绿饽扛?睦?樱?span>[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 相关文章推荐
用js+xml自动生成表格的东西
Dec 21 Javascript
js写一个弹出层并锁屏效果实现代码
Dec 07 Javascript
关于jQuery中.attr()和.prop()的问题探讨
Sep 06 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
Jan 10 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
JavaScript弹窗基础篇
Apr 27 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
Node.js中路径处理模块path详解
Nov 14 Javascript
基于javascript实现按圆形排列DIV元素(二)
Dec 02 Javascript
用JavaScript做简易的购物车的代码示例
Oct 20 Javascript
JS非行间样式获取函数的实例代码
Jun 05 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
Nov 11 Javascript
jQuery scrollFix滚动定位插件
Apr 01 #Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 #Javascript
JS获取iframe中longdesc属性的方法
Apr 01 #Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
Apr 01 #Javascript
JS去除iframe滚动条的方法
Apr 01 #Javascript
JS动态修改iframe内嵌网页地址的方法
Apr 01 #Javascript
JS获得图片alt信息的方法
Apr 01 #Javascript
You might like
基于mysql的bbs设计(五)
2006/10/09 PHP
PHP文本操作类
2006/11/25 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
vue项目实战总结篇
2018/02/11 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
Python入门篇之数字
2014/10/20 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
浅述python2与python3的简单区别
2018/09/19 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
运动会入场词60字
2014/02/15 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
失职检讨书大全
2015/01/26 职场文书