javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号


Posted in Javascript onJuly 21, 2012

具体题目是这样的:

从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确治鱿绿饽扛?睦?樱?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 相关文章推荐
jquery判断元素的子元素是否存在的示例代码
Feb 04 Javascript
JavaScript实现弹出子窗口并传值给父窗口
Dec 18 Javascript
通过实例理解javascript中没有函数重载的概念
Jun 03 Javascript
jQuery Pagination分页插件使用方法详解
Feb 28 Javascript
node+vue实现用户注册和头像上传的实例代码
Jul 20 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
Oct 23 Javascript
npm配置国内镜像资源+淘宝镜像的方法
Sep 07 Javascript
原生JS实现自定义下拉单选选择框功能
Oct 12 Javascript
小程序Request的另类用法详解
Aug 09 Javascript
详解elementUI中input框无法输入的问题
Apr 27 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 Javascript
Javascript中找到子元素在父元素内相对位置的代码
Jul 21 #Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 #Javascript
基于jquery的可多选的下拉列表框
Jul 20 #Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
Jul 20 #Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 #Javascript
基于jquery的图片轮播 tab切换组件
Jul 19 #Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
Jul 17 #Javascript
You might like
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
超级给力的JavaScript的React框架入门教程
2015/07/02 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
细说webpack6 Babel的使用详解
2019/09/26 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
Python实现将Excel转换为json的方法示例
2017/08/05 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
python解析多层json操作示例
2019/12/30 Python
Django model class Meta原理解析
2020/11/14 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
大学生农村教师实习自我鉴定
2013/09/21 职场文书
家长给老师的道歉信
2014/01/13 职场文书
工作推荐信范文
2014/05/10 职场文书
职业规划实施方案
2014/06/10 职场文书
计算机实训报告范文
2014/11/05 职场文书
顶岗实习计划书
2015/01/16 职场文书
汽车销售助理岗位职责
2015/04/14 职场文书
教师远程研修感悟
2015/11/18 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js