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 相关文章推荐
js 表单验证方法(实用)
Apr 28 Javascript
JavaScript 判断日期格式是否正确的实现代码
Jul 04 Javascript
从面试题学习Javascript 面向对象(创建对象)
Mar 30 Javascript
javascript将相对路径转绝对路径示例
Mar 14 Javascript
关于Javascript 对象(object)的prototype
May 09 Javascript
深入浅析react native es6语法
Dec 09 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
Sep 14 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
Oct 27 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
JS实现碰撞检测的方法分析
Jan 19 Javascript
vue-router源码之history类的浅析
May 21 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
RequireJs的使用详解
2017/02/19 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
小程序自定义日历效果
2018/12/29 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
工厂保安员岗位职责
2014/01/31 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
旅游安全协议书
2014/04/21 职场文书
作文评语大全
2014/04/23 职场文书
物业管理专业自荐信
2014/07/01 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
七年级作文之游记
2019/12/11 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL