题目:

  现有‘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. 基于Struts自定义MVC-2

    自定义MVC        数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 import javax.servlet.http.*; pu ...

  2. 关于利用input的file属性在页面添加图片的问题

    在页面添加图片涉及到兼容的问题怎么解决兼容问题呢?请看下面分析: 在IE浏览器上面我们能直接通过获取其input的value值来获取其图片的路径. 在火狐和谷歌需要用createObjectURL(( ...

  3. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶

    日常啰嗦 上一篇文章<Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建>简单的讲了一下SVN服务器的搭建,并没有详细的介绍配置文件及一些复杂的功能, ...

  4. golang http server分析(一)

    http:http请求过程实质上是一个tcp连接通信,具体通过socket接口编码实现 在go中是通过listenAndServer()方法对外提供了一个http服务,在该方法中完成了socket的通 ...

  5. Solr5.2.1+Zookeeper3.4.8分布式集群搭建

    1.选取三台服务器 由于机器比较少,现将zookeeper和solr都部署在以下三台机器上.(以下操作都是在172.16.20.101主节点上进行的哦) 172.16.20.101 主节点 172.1 ...

  6. requireJS 从概念到实战

    requireJS 可以很轻易的将一个项目中的JavaScript代码分割成若干个模块(module).并且requireJS推荐一个模块就是一个文件,所以,你将获得一些零碎的具有互相依赖关系的JS文 ...

  7. [TPYBoard - Micropython 之会python就能做硬件 9] 五分种学会用TPYBoard V102 制作避障小车(升级版)

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 感谢山东萝卜电子科技公司授权   一.实验器材 1.TPYboard V102板 ...

  8. ASP.NET Core:使用Dapper和SwaggerUI来丰富你的系统框架

    一.概述 1.用VS2017创建如下图的几个.NET Standard类库,默认版本为1.4,你可以通过项目属性进行修改,最高支持到1.6,大概五月份左右会更新至2.0,API会翻倍,很期待! 排名分 ...

  9. PRINCE2的价值是什么?

    很多学员在进行培训的过程中或者培训后,都会对于PRINCE2带来的价值有各种各样的看法.但是从更加官方一点的角度来说,PRINCE2会有一部分比较通用 的观点. PRINCE2 可以应用到任何类型的项 ...

  10. .net core 持续构建简易教程

    环境需求:jenkins和.netcore 由于jenkins在真机上的部署比较麻烦,所以在这里我使用基于jenkins的Docker,只要任何一台运行docker的环境都可以进行以下的操作. doc ...