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模拟多线程
Feb 07 Javascript
JavaScript confirm选择判断
Oct 18 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
Apr 05 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
Feb 05 Javascript
jquery固定底网站底部菜单效果
Aug 13 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
Mar 19 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
Jun 06 Javascript
详解JavaScript 中 if / if...else...替换方式
Jul 15 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
Sep 11 Javascript
JavaScript 几种循环方式以及模块化的总结
Sep 03 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/09/09 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
一些技巧性实用js代码小结
2009/10/14 Javascript
json 入门基础教程 推荐
2009/10/31 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
python进阶教程之模块(module)介绍
2014/08/30 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
Python实现代码统计工具
2019/09/19 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
春节晚会主持词
2014/03/24 职场文书
大四毕业生自荐书
2014/07/05 职场文书
2014最新实习证明模板
2014/10/02 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
工作检讨书大全
2015/01/26 职场文书
计划生育目标责任书
2015/05/09 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
python保存图片的四个常用方法
2022/02/28 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python