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 处理事件绑定的一些兼容写法
Dec 24 Javascript
选择复选框按钮置灰否则按钮可用
May 22 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
May 28 Javascript
jQuery学习笔记之toArray()
Jun 09 Javascript
JavaScript事件代理和委托详解
Apr 08 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
3分钟了解vue数据劫持的原理实现
May 01 Javascript
JS+CSS实现3D切割轮播图
Mar 21 Javascript
JS使用Chrome浏览器实现调试线上代码
Jul 23 Javascript
JavaScript 去重和重复次数统计
Mar 31 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 地址栏信息的获取代码
2009/01/07 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
javascript document.execCommand() 常用解析
2009/12/14 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL