java实现排列序数
X星系的某次考古活动发现了史前智能痕迹。
这是一些用来计数的符号,经过分析它的计数规律如下:
(为了表示方便,我们把这些奇怪的符号用a~q代替)
abcdefghijklmnopq 表示0
abcdefghijklmnoqp 表示1
abcdefghijklmnpoq 表示2
abcdefghijklmnpqo 表示3
abcdefghijklmnqop 表示4
abcdefghijklmnqpo 表示5
abcdefghijklmonpq 表示6
abcdefghijklmonqp 表示7
…
在一处石头上刻的符号是:
bckfqlajhemgiodnp
请你计算出它表示的数字是多少?
请提交该整数,不要填写任何多余的内容,比如说明或注释。
22952601027516
//简易求解
public class Main1 {
public static long count = 0L;
public static boolean[] used = new boolean[17];
public static long getMultiN(int n) {
if(n == 0)
return 1;
long result = 1L;
for(int i = 1;i <= n;i++)
result = result * i;
return result;
}
public static void main(String[] args) {
String A = "bckfqlajhemgiodnp";
for(int i = 0;i < 17;i++)
used[i] = false;
for(int i = 0;i < A.length();i++) {
int temp = A.charAt(i) - 'a';
used[temp] = true;
int num = 0;
for(int j = 0;j < temp;j++) {
if(used[j] == false)
num++;
}
count = count + num * getMultiN(16 - i);
}
System.out.println(count);
}
}
//求解全排列,由于10位以上就会超时,以下经过一点处理,以下代码仅仅是记录楼主自己当时做题的思考过程,仅仅提供参考~
public class Main {
public static long count = 0L;
public void swap(char[] A, int a, int b) {
char temp = A[a];
A[a] = A[b];
A[b] = temp;
}
public boolean judge(char[] A) {
for(int i = 1;i < A.length;i++) {
if(A[i - 1] < A[i])
return true;
}
return false;
}
public int getI(char[] A) {
int maxi = A.length - 2;
for(int i = A.length - 1;i >= 1;i--) {
if(A[i - 1] < A[i]) {
maxi = i - 1;
break;
}
}
return maxi;
}
public int getJ(char[] A) {
int j = getI(A);
char value = A[j];
j++;
for(;j < A.length;j++) {
if(A[j] < value) {
j = j - 1;
break;
}
}
if(j == A.length)
j = j - 1;
return j;
}
public void reverseArray(char[] A, int start, int end) {
while(start < end) {
char temp = A[start];
A[start++] = A[end];
A[end--] = temp;
}
}
//字典序排列
public void printResult1(char[] A) {
String B = "hemgiodnp";
char[] arrayB = B.toCharArray();
while(judge(A)) {
int i = getI(A);
int j = getJ(A);
swap(A, i, j);
reverseArray(A, i + 1, A.length - 1);
count++;
int k = 0;
for(;k < A.length;k++) {
if(arrayB[k] != A[k])
break;
}
if(k == A.length) {
System.out.println("最终结果:"+count);
break;
}
}
}
public static long getN(int n) {
long sum = 1L;
for(int i = 1;i <= n;i++)
sum *= i;
return sum;
}
public static void main(String[] args) {
Main test = new Main();
count = count + getN(16) + getN(15) + 8 * getN(14) + 3 * getN(13) + 12 * getN(12) + 7 * getN(11) + 5 * getN(9);
String A = "deghimnop";
char[] arrayA = A.toCharArray();
test.printResult1(arrayA);
}
}
java实现排列序数的更多相关文章
- java实现第五届蓝桥杯排列序数
排列序数 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号: abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bac ...
- Java字符串排列算法
Java字符串排列算法 题目:现有ABCDE 5个球 构成的排列组合 可重复抽取 最多取到16个 共有多少种组合方式? 比如:取1个球可以构成的组合有 A B C D E 共5种,取2个球可以构成的组 ...
- java实现排列组合(通俗易懂)
个人感觉这篇文章(原文地址见文章尾)写的排列组合问题,非常的好,而且是一步一步引出排列组合问题,我也是看了这篇文章,一步一步按照这个思路来,最后会了自己的一套排列组合 也因此在算法竞赛中,两次用到了, ...
- java实现排列为平方数
** 排列为平方数** 若干不同的数字,排列组合后能产生多少个平方数? 下面的代码解决了这个问题. 对于:1,6,9 排列后,可产生3个平方数: 169 196 961 请阅读下面的代码,填写缺失的部 ...
- 算法笔记_206:第五届蓝桥杯软件类决赛真题(Java语言A组)
目录 1 海盗分金币 2 六角幻方 3 格子放鸡蛋 4 排列序数 5 幂一矩阵 6 供水设施 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 海盗分金币 有5个海盗,相约进行一次帆船比赛. 比 ...
- 算法笔记_127:蓝桥杯2017模拟赛-本科组习题解答(Java)
目录 1 算年龄 2 猜算式 3 排列序数 4 字符串比较 5 还款计算 6 滑动解锁 7 风险度量 PS:以下代码部分仅供参考,若有不当之处,还请路过同学指出哦~ 1 算年龄 标题:算年龄 英 ...
- 2.1JAVA基础复习——JAVA语言的基础组成注释和常量变量
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
- 【aliyun】学java,看这里,不迷茫!1460道Java热门问题
阿里极客公益活动: 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了 他们用户自己手中的技术来帮助用户成长 ...
- 2014年第五届蓝桥杯国赛试题(JavaA组)
1.结果填空 (满分15分)2.结果填空 (满分45分)3.代码填空 (满分30分)4.程序设计(满分30分)5.程序设计(满分80分)6.程序设计(满分100分) 1.标题:海盗分金币 有5个海盗, ...
随机推荐
- nginx default server
配合server_name _ 可以匹配所有的域名,在设置default server 可以轻松屏蔽一些非域名访问的请求. 配置如下 server { listen 80 default_server ...
- for循环中break和continue的区别
break 会立即退出循环,强制执行循环后面的语句 默认只会终止紧邻的循环,如果要终止其他循环,需要给循环起名字 例如: name:for(var i = 0; i < 5; i++){ for ...
- Apache自定义404
先用命令找到httpd.conf文件在哪 find -name 'httpd.conf' 默认配置文件: vim /etc/httpd/conf/httpd.conf 然后找到项目的路径 <Di ...
- package.json中^,~的区别
https://blog.csdn.net/peaceoncemore/article/details/79195206 "devDependencies": { " ...
- JAVA基础4---序列化和反序列化深入整理(JDK序列化)
一.什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成 ...
- 安卓网络编程学习(1)——java原生网络编程(1)
写在前面 马上要进行第二轮冲刺,考虑到自己的APP在第一轮冲刺的效果不尽人意,有很多网络方面的小BUG,这里就系统学习一下网络编程,了解来龙去脉,以便更好的对项目进行优化处理. http协议 http ...
- SpringBoot_自动装配
SpringBoot SrpingBoot 给人的第一印象就是 简洁,易上手.它是自 Spring 而来为了简化我们开发的,而经历过了 Spring 中繁琐的配置文件,我确实很好奇它到底是怎么帮我们把 ...
- 哥德巴赫猜想 Java实现
1.接口实现 package goldbach; /** * 输入一个大于6的偶数,请输出这个偶数能被分解为哪两个质数的和.如:10=3+7 12=5+7 * 此为按接口实现类完成 * * @auth ...
- 战略威慑 51nod提高组试题
AC通道 题目背景 马奥雷利亚诺布恩迪亚上校发动了他的第三十二次战争,让我们祝他好运. 题目描述 马孔多附近有n个城市, 有n-1条双向道路连通这些城市.上校想通过摧毁两条公路的方式对当局予以威慑.但 ...
- [Axure教程]0003.元件的触发事件
Axure RP 的每个元件都有着自己独有的和一些公共的触发事件,在不同的情况下触发不同的事件. 这里我们就以上图中文本输入框为例 A.改元件已使用的触发事件 [1].文字改变时:当一个元件内的文字改 ...