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兼容性汇编(zz)
Feb 02 Javascript
js关闭当前页面(窗口)的几种方式总结
Mar 05 Javascript
Jquery 实现弹出层插件
Jan 28 Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 Javascript
全屏js头像上传插件源码高清版
Mar 29 Javascript
jQuery中常用动画效果函数(日常整理)
Sep 17 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
Jul 16 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
在Vue环境下利用worker运行interval计时器的步骤
Aug 01 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
Vue select 绑定动态变量的实例讲解
Oct 22 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
Nov 04 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设置一边执行一边输出结果的代码
2013/09/30 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
node.js中watch机制详解
2014/11/17 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
Python对象转JSON字符串的方法
2016/04/27 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
儿科护士实习自我鉴定
2013/10/17 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
超市活动计划书
2014/04/24 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书