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 数组实现一个类似ruby的迭代器
Oct 27 Javascript
JavaScript 继承机制的实现(待续)
May 18 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
js innerHTML 改变div内容的方法
Aug 03 Javascript
使用javascript提交form表单方法汇总
Jun 25 Javascript
深入理解JavaScript中的浮点数
May 18 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
Jun 02 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
使用Curl命令查看请求响应时间方法
Nov 04 Javascript
javascript实现无法关闭的弹框
Nov 27 Javascript
树结构之JavaScript
Jan 24 Javascript
基于Cookie常用操作以及属性介绍
Sep 07 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
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
jQuery代码优化 事件委托篇
2011/11/01 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
jQuery使用方法
2017/02/04 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
小程序实现锚点滑动效果
2019/09/23 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Python中使用不同编码读写txt文件详解
2015/05/28 Python
python制作websocket服务器实例分享
2016/11/20 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
项目合作协议书范本
2014/04/16 职场文书
销售求职信范文
2014/05/26 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
医院保洁员管理制度
2015/08/05 职场文书
初中政教处工作总结
2015/08/12 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
python如何获取网络数据
2021/04/11 Python
对Keras自带Loss Function的深入研究
2021/05/25 Python