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设计模式 接口介绍
Jul 24 Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
Apr 28 Javascript
JS实现动画兼容性的transition和transform实例分析
Dec 13 Javascript
javascript实现一个网页加载进度loading
Jan 04 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
Ajax和Comet技术总结
Feb 19 Javascript
浅谈箭头函数写法在ReactJs中的使用
Aug 22 Javascript
jQuery实现参数自定义的文字跑马灯效果
Aug 15 jQuery
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
Mar 29 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
微信小程序实现星星评分效果
Nov 01 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下对数组进行排序的函数
2010/08/08 PHP
PHP 第三节 变量介绍
2012/04/28 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
写的htc的数据表格
2007/01/20 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
Python httplib模块使用实例
2015/04/11 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
美国宠物商店:Wag.com
2016/10/25 全球购物
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
迟到检讨书900字
2014/01/14 职场文书
运动会广播稿200米
2014/01/27 职场文书
公司合作意向书
2014/04/01 职场文书
父母寄语大全
2014/04/12 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
公司离职证明样本
2014/09/13 职场文书
杜甫草堂导游词
2015/02/03 职场文书
springboot入门 之profile设置方式
2022/04/04 Java/Android