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个海盗, ...
随机推荐
- 关于前后端写入Cookie时domain的一个问题
1.1. 前端 先假设有如下setCookie方法: function setCookie(name, value, day, path, domain) { day = day || 30; pat ...
- Linux shell 正则表达式用法
1.“ \ ” 用法 用于关闭其后续字符的特殊含义,恢复字符的本身含义,如:\\ 表示字符 \ 2. “ . " 用法 匹配任意单个字符 3. " * " 用法 匹配任 ...
- 2018-06-21 js正则表达式
正则表达式:描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 1.修饰符 i->忽略大小写: g->全部匹配: m- ...
- helm使用
helm 0. helm安装 基本上到github上面,下载二进制就行.mac的话用brew安装. https://github.com/helm/helm brew: brew install ku ...
- 【雕爷学编程】Arduino动手做(60)---WS2812直条8位模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...
- linux常用命令---网络端口信息与进程管理
进程管理 进程管理
- hdu6007 spfa+完全背包
题意:给你M,N,K,代表你有M点法力值,N个物品,K个制造方式 接下来N行,如果以1开头则代表既能卖又能合成,0代表只能卖. 然后K行,每行第一个数是要合成的东西,第二个数代表有几对,每对第一个数是 ...
- poj2987 最大闭合权子图基础题
Firing Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 10905 Accepted: 3291 Descript ...
- Java——动态生成POJO类
package com.java.test.dynamicpojo; import java.io.ByteArrayOutputStream; import java.io.IOException; ...
- Java——读取和写入txt文件
package com.java.test.a; import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...