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);
    }
}
原文地址:https://www.cnblogs.com/a1439775520/p/13077809.html