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 相关文章推荐
javascript AOP 实现ajax回调函数使用比较方便
Nov 20 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
Dec 12 Javascript
javascript确认框的三种使用方法
Dec 17 Javascript
jQuery插件jRumble实现网页元素抖动
Jun 05 Javascript
javascript闭包概念简单解析(推荐)
Jun 03 Javascript
JavaScript程序中实现继承特性的方式总结
Jun 24 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
Jan 18 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 jQuery
对vux点击事件的优化详解
Aug 28 Javascript
vue router 源码概览案例分析
Oct 09 Javascript
React 源码中的依赖注入方法
Nov 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通过COM类调用组件的实现代码
2012/01/11 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
Python中逗号的三种作用实例分析
2015/06/08 Python
深入理解Python3中的http.client模块
2017/03/29 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
django admin组件使用方法详解
2019/07/19 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
python如何写出表白程序
2020/06/01 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
求职自荐信
2013/12/14 职场文书
销售心得体会
2014/01/02 职场文书
开业庆典策划方案
2014/02/18 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
项目建议书怎么写
2014/05/15 职场文书
企业消防安全责任书
2014/07/23 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js