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 相关文章推荐
用正则xmlHttp实现的偷(转)
Jan 22 Javascript
jquery链式操作的正确使用方法
Jan 06 Javascript
jquery中get和post的简单实例
Feb 04 Javascript
jquery中交替点击事件的实现代码
Feb 14 Javascript
JavaScript中length属性的使用方法
Jun 05 Javascript
JavaScript的设计模式经典之代理模式
Feb 24 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
前端MVVM框架解析之双向绑定
Jan 24 Javascript
微信小程序官方动态自定义底部tabBar的例子
Sep 04 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
Sep 25 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
May 01 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之第十天
2006/10/09 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
javascript定时变换图片实例代码
2013/03/17 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
详解vue高级特性
2020/06/09 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
python enumerate函数的使用方法总结
2017/11/15 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
行政部经理助理岗位职责
2014/06/15 职场文书
保密工作目标责任书
2014/07/28 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
兵马俑的导游词
2015/02/02 职场文书
吴仁宝观后感
2015/06/09 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技