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 相关文章推荐
Js动态创建div
Sep 25 Javascript
帮助避免错误的Javascript陷阱清单
May 31 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
jQuery插件实现静态HTML验证码校验
Nov 06 Javascript
面试常见的js算法题
Mar 23 Javascript
js实现前端图片上传即时预览功能
Aug 02 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
Vue完整项目构建(进阶篇)
Feb 10 Javascript
js实现购物车功能
Jun 12 Javascript
vue element中axios下载文件(后端Python)
May 10 Javascript
JavaScript实现页面中录音功能的方法
Jun 04 Javascript
Vue仿Bibibili首页的问题
Jan 21 Vue.js
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网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
PHP学习笔记之一
2011/01/17 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
javascript fullscreen全屏实现代码
2009/04/09 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
js实现数组转换成json
2015/06/26 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
python网络爬虫采集联想词示例
2014/02/11 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
Melissa香港官网:MDreams
2016/07/01 全球购物
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
QQ空间主人寄语大全
2014/04/12 职场文书
成绩单家长评语大全
2014/04/16 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
房屋产权证明书
2014/10/15 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
地球一小时活动总结
2015/02/27 职场文书
2016大学军训心得体会
2016/01/11 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers