• 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);
        }
    }
    
  • 相关阅读:
    经典排序算法
    892. 三维形体的表面积
    252. 会议室
    253. 会议室 II
    876. 链表的中间结点
    543. 二叉树的直径
    836. 矩形重叠
    1055. 形成字符串的最短路径
    Android Studio Error: No sdk api is defined in local.properties
    Android Studio打开Android源码工程
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947927.html
Copyright © 2020-2023  润新知