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 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
Discuz! 6.1_jQuery兼容问题
Sep 23 Javascript
Jquery实现仿腾讯微博发表广播
Nov 17 Javascript
编写简单的jQuery提示插件
Dec 21 Javascript
AngularJS身份验证的方法
Feb 17 Javascript
基于Turn.js 实现翻书效果实例解析
Jun 20 Javascript
bootstrap配合Masonry插件实现瀑布式布局
Jan 18 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
Vue实现动态显示textarea剩余字数
May 22 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
Jun 09 jQuery
基于VUE.JS的移动端框架Mint UI的使用
Oct 11 Javascript
4个顶级JavaScript高级文本编辑器
Oct 10 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查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
起点页面传值js,有空研究学习下
2010/01/25 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
详解Django中的权限和组以及消息
2015/07/23 Python
Python中交换两个元素的实现方法
2018/06/29 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
商务专员岗位职责范本
2014/06/29 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS