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 相关文章推荐
jquery插件 autoComboBox 下拉框
Dec 22 Javascript
基于jquery实现的表格分页实现代码
Jun 21 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
windows8.1+iis8.5下安装node.js开发环境
Dec 12 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
Dec 24 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
jQuery获得字体颜色16位码的方法
Feb 20 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
webpack的pitching loader详解
Sep 23 Javascript
JS监听组合按键思路及实现过程
Apr 17 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
Aug 24 Javascript
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
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
简单的js计算器实现
2016/10/26 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
python IP地址转整数
2020/11/20 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
销售类求职信
2014/06/13 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
步步惊心观后感
2015/06/12 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL