题目:

  现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的

  据说这道题是百度校招的一道算法题,反正我觉得我在学校的时候很可能做不出来。在学校的时候真该好好学习啊,我也逃不过毕业之后再来后悔的命运。但是,我还是要说点正能量的话,

只要知道学,什么时候都不晚。至少现在我做这道题的时候没遇到太大的困难,说明毕业之后的学习还是有很大作用的。为了我喜欢的编程,为了我喜欢的算法,继续努力!

  言归正传,我看到这道题的时候,原文有这道题的解法和思路,但是原谅我是学渣,看不懂那些数学公式

  

  我的思路是,假如,给出的第一位是b(给出的这个字符串简称str),那么所有以a开头的字符串都会排在str前面。

  以a开头的字符串的数量是多少呢?就是后面11位字符所有的排列组合,也就是11的阶乘。

  如果第一位是c,那么所有以a或者b开头的所有字符串就会排在str的前面,也就是 2*11! (注意后面是11的阶乘,不是11),依次类推,可以知道第一位是任意字符时排在str前面的字符串的数量

  接着看第二位,第二位的思路和第一位一样,同样可以知道第二位是任意字符时排在str前面的字符串的数量,以此类推,后面的字符都算完之后,把全部结果相加

  但是,这个时候还有一个问题,在这道题中12个字符是固定的,所以假如第一位不是a,是b,那么a在后面的字符中一定会出现,同时b也不会再出现,所以在进行上面的计算时,不能直接以字典序来进行计算,在计算每一位时要根据尚未出现过得字符的顺序,来排列未出现的字符的顺序,具体看代码里的注释,不明白的地方debug一步一步看。

/**
* 现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
* System.out.println(getSortNum("abcdefghijlk")); //1
* System.out.println(getSortNum("hgebkflacdji")); //302715242
* System.out.println(getSortNum("gfkedhjblcia")); //260726926
*/
public static int getSortNum(String value) {
// 记录已经出现过得字符和未出现的字符顺序
String sort = "abcdefghijkl"; // 记录结果数
int res = 1;
for(int i=0;i<value.length();i++) {
// 依次取各位的字符
char c = value.charAt(i);
// 查看该字符在所有字符中的当前顺序
int head = sort.lastIndexOf(c);
// 计算排在前面的字符串数量
res += ((head-i)*factorial(11-i)); // 修改字符顺序,将当前出现的字符,交换到字符最前面
// 因为我们不关心已经出现过得字符的顺序,我们只要知道出现过哪些字符以及未出现的字符的字典序
// 所以直接把出现过得字符扔到最前面就可以了
sort = change(sort, head);
}
return res;
} /**
* 求阶乘
* @param i
* @return
*/
public static int factorial(int i) {
if(i==0) return 0;
int result = 1;
for(;i>1;i--) {
result *= i;
}
return result;
} /**
* 将字符串第a位换到最前面
* @param str
* @param a
* @param b
* @return
*/
public static String change(String str,int a) {
char[] chars = str.toCharArray();
char temp = chars[a];
for(int i=a;i>0;i--) {
chars[i] = chars[i-1];
}
chars[0] = temp;
return String.valueOf(chars);
}

  可能我说的不是很清楚,我是新手,多谅解谅解,可以看代码,有什么不对的地方欢迎指出

现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的的更多相关文章

  1. [No000093]按住Alt 再按数字键敲出任意汉字和字符!

    1.在notepad里,(中文系统下) 按住Alt 然后按52946最后放开Alt 按住Alt 然后按45230最后放开Alt 按住Alt 然后按50403最后放开Alt 你会看到"我爱你& ...

  2. 用6个字符写出任意的Javascript代码

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用6个字符写出任意的Javascript代码.

  3. 只用这 6 个字符,就可以写出任意 JavaScript 代码!

    你可能在网上见过有人用 几个不同的字符写的各种稀奇古怪的 JavaScript 代码,虽然看起来奇怪,但是能正常运行!比如这个: (!(~+[])+{})[--[~+""][+[] ...

  4. 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

    // test20.cpp : 定义控制台应用程序的入口点. // include "stdafx.h" include include include include inclu ...

  5. 使用开源Breeze工具部署Kubernetes 1.12.1高可用集群

    Breeze项目是深圳睿云智合所开源的Kubernetes图形化部署工具,大大简化了Kubernetes部署的步骤,其最大亮点在于支持全离线环境的部署,且不需要FQ获取Google的相应资源包,尤其适 ...

  6. nyoj 139 我排第几个--康拓展开

    我排第几个 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说 ...

  7. [lua]笔试-按字典序列出指指定的序列的位置

    计算方法: n的阶乘记为f(n), s为输入序列, sub(i)为s的i到n的子序列.A(i)为第i位对应的字母在子序列sub(i)中的字典顺序 N(s) = sum_{1,n} T(i)*(A(i) ...

  8. web请求

    概述 发起一个http请求的过程就是建立一个socket通信的过程. 我们可以模仿浏览器发起http请求,譬如用httpclient工具包,curl命令等方式. curl "http://w ...

  9. NYOJ--139--我排第几个(康托展开)

    我排第几个 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl"12个字符,将其所有的排列中按字典序排列,给出任意一 ...

随机推荐

  1. Mac OSX Sierra WiFi connecting problem

    吐槽一下,苹果的质量管控越来越差了. Mac OSX Sierra有时突然或升级后会遇到wifi不停重连连不上问题,现象为不停地连接wifi. 网上有人说删除 /Library/Preferences ...

  2. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  3. Summary Ranges leetcode

    Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...

  4. ionic的安装

    一.学习一样新的框架的步骤: 1.先找到人家的网站, 一个个点过来看看 2.我们前端的框架,分css与js 3.先学css 再学js 4.要学会复制黏贴代码, 实际演练代码的效果 二.ionic环境安 ...

  5. 有关html,css,js,less的使用规范

    写前端写久了,规则跟着开发的项目走,突然觉得是不是该总结总结前端的语言使用规则,看到下面这篇还不错,就直接链接过来了哦 http://zhibimo.com/read/Ashu/front-end-s ...

  6. centos登录时一闪而过,显示module is unknown

    原因是修改了在/etc/pam.d/login中加入了: session required /lib/security/pam_limits.so session required pam_limit ...

  7. Python可视化学习(1):Matplotlib的配置

    Matplotlib是一个优秀的可视化库,它提供了丰富的接口,让Python的可视化落地显得非常容易上手.本系列是本人学习python可视化的学习笔记,主要用于监督自己的学习进度,同时也希望和相关的博 ...

  8. ios微信自动播放音乐

    <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8 ...

  9. Vue服务端渲染和Vue浏览器端渲染的性能对比

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  10. Appium手势密码滑动之Z字形走势(java篇)

    1.直接使用负的偏移量appium会报错,在后面加上moveto(1,1)就行了 2.直接看图说话 废话少说看代码如: List<AndroidElement> element = dri ...