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 相关文章推荐
Javascript的IE和Firefox兼容性汇编
Jul 01 Javascript
解决jquery的datepicker的本地化以及Today问题
May 23 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
Oct 14 Javascript
Js获取当前日期时间及格式化代码
Sep 17 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
Oct 25 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
Jan 04 Javascript
vue中如何使用ztree
Feb 06 Javascript
微信小程序实现蒙版弹窗效果
Nov 01 Javascript
详解js实时获取并显示当前时间的方法
May 10 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
Jun 04 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 Javascript
javascript条件式访问属性和箭头函数介绍
Nov 17 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+Ajax实现验证码的实时验证
2016/07/20 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
jQuery访问json文件中数据的方法示例
2019/01/28 jQuery
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
Python实现屏幕截图的两种方式
2018/02/05 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
解决Python中回文数和质数的问题
2019/11/24 Python
python中的itertools的使用详解
2020/01/13 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
党员2014两会学习心得体会
2014/03/17 职场文书
公司寄语大全
2014/04/10 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书