1. 程式人生 > >編碼字典序排序

編碼字典序排序

/**
 * 假定一種編碼的編碼範圍是a ~ y的25個字母,從1位到4位的編碼,如果我們把該編碼按字典序排序,
 * 形成一個數組如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …,
 * yyyw, yyyx, yyyy 其中a的Index為0,aa的Index為1,aaa的Index為2,以此類推。
 * 編寫一個函式,輸入是任意一個編碼,輸出這個編碼對應的Index.
 */

分析如下圖:

程式碼如下

public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        System.out.println(encode(s));
    }
    public static int encode(String s){
        int index = 0;
        int[] factor = {25*25*25+25*25+25+1,25*25+25+1,25+1,1};
        for(int i = 0; i < s.length();i++) {
            index = index + (s.charAt(i)-'a')*factor[i]+1;
        }
        return index-1;
    }

}

我們知道了怎樣編碼,那麼相應的我們也可以利用這個陣列進行解碼,只需要用%來判斷。

 public static void unencode(int index){
        String s = null;
        int[] factor = {25*25*25+25*25+25+1,25*25+25+1,25+1,1};
        int i = 0;
        int[] data = new int[4];
        while(index > 0){
            /**
             * 記錄四層中的每層的層數
             */
            data[i] = index/factor[i];
            /**
             * 計算去掉這層之後剩下的索引數
             */
            index = index%factor[i]-1;
            i++;
        }
        for(int j = 0; j < data.length;j++) {
            /**
             * 輸出
             */
            System.out.print((char) ('a'+data[j]));
        }

    }