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 相关文章推荐
用javascript获得地址栏参数的两种方法
Nov 08 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
js判断选择时间不能小于当前时间的示例代码
Sep 24 Javascript
JS+CSS实现DIV层的展开、收缩效果
Jan 28 Javascript
详解angularJs中自定义directive的数据交互
Jan 13 Javascript
Jquery根据浏览器窗口改变调整大小的方法
Feb 07 Javascript
vue-router路由简单案例介绍
Feb 21 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
vue中render函数的使用详解
Oct 12 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
详解从vue-loader源码分析CSS Scoped的实现
Sep 23 Javascript
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python制作数据导入导出工具
2015/07/31 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
python简单验证码识别的实现方法
2019/05/10 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
会计专业的自荐信
2013/12/12 职场文书
丧事主持词大全
2014/04/02 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
拉贝日记观后感
2015/06/05 职场文书
大学生党课感想
2015/08/11 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
Moment的feature导致线上bug解决分析
2022/09/23 Javascript