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 异步调用框架 (Part 1 - 问题 &amp; 场景)
Aug 03 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
Dec 04 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
Jan 29 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
Oct 10 Javascript
jQuery 的 ready()的纯js替代方法
Nov 20 Javascript
Javascript中call,apply,bind方法的详解与总结
Dec 12 Javascript
详解vue.js2.0父组件点击触发子组件方法
May 10 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
vue-cli中使用高德地图的方法示例
Mar 28 Javascript
JavaScript实现好看的跟随彩色气泡效果
Feb 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 开源AJAX框架14种
2009/08/24 PHP
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
Python基于requests库爬取网站信息
2020/03/02 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
数据库面试要点基本概念
2013/10/31 面试题
音乐表演专业毕业生求职信
2013/10/14 职场文书
2013年高中生自我评价
2013/10/23 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
财务出纳岗位职责
2014/02/03 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
产品开发计划书
2014/04/27 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
董事长秘书工作总结
2015/08/14 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫