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 相关文章推荐
$.ajax json数据传递方法
Nov 19 Javascript
javascript测试题练习代码
Oct 10 Javascript
onkeydown事件解决按回车键直接提交数据的需求
Apr 11 Javascript
js使用数组判断提交数据是否存在相同数据
Nov 27 Javascript
使用js写的一个简易的投票
Nov 27 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
Jquery基础之事件操作详解
Jun 14 Javascript
vue实现可增删查改的成绩单
Oct 27 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
Dec 28 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
javaScript中的空值和假值
Dec 18 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 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使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
js实现进度条的方法
2015/02/13 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
JS面向对象编程详解
2016/03/06 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
Python ftp上传文件
2016/02/13 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python实现视频下载功能
2017/03/14 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
python动态进度条的实现代码
2019/07/03 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
Python datetime包函数简单介绍
2019/08/28 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
大学军训感言1500字
2014/03/09 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
作弊检讨书
2015/01/27 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL