编码字典序排序

/**
 * 假定一种编码的编码范围是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]));
        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值