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 中令人困惑的变量赋值
Aug 13 Javascript
Package.js  现代化的JavaScript项目make工具
May 23 Javascript
通过url查找a元素并点击
Apr 09 Javascript
用js替换除数字与逗号以外的所有字符的代码
Jun 07 Javascript
AngularJS入门教程之学习环境搭建
Dec 06 Javascript
仿JQuery输写高效JSLite代码的一些技巧
Jan 13 Javascript
Bootstrap每天必学之缩略图与警示窗
Nov 29 Javascript
响应式表格之固定表头的简单实现
Aug 26 Javascript
最常见和最有用的字符串相关的方法详解
Feb 06 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
Apr 18 Javascript
Easyui和zTree两种方式分别实现树形下拉框
Aug 04 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
Oct 19 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 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
企业节能减排实施方案
2014/03/19 职场文书
电钳工人个人求职信
2014/05/10 职场文书
2014组织生活会方案
2014/05/19 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
安全生产会议制度
2015/08/06 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers