牛客网-腾讯编程校招真题 编码 Java

题目描述:

假定一种编码的编码范围是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.
输入描述:
输入一个待编码的字符串,字符串长度小于等于100.
输出描述:
输出这个编码的index

思路:

看我的思路前先看夕一啊may.的解答
看完之后,就理解了如何去做
不论输入的字符串是几位,第一位一定是这样求: result += str[0] * (25^3+25^2+25+1)
第二位(如果有), result += str[1] *(25^2+25+1)+1
第三位(如果有), result += str[2]* (25+1)+1
第四位(如果有), result += str[3]* (1)+1

之所以加1,假设输入的是bcde,计算第一位的时候只计算b之前的个数,忽略了b本身;计算第二位的时候之间算了[ba,bc)之间的个数,忽略了bc本身;计算第三位的时候只计算[bca,bcd)之间的个数忽略了bcd本身;计算第四位的时候只计算了[bcda~bcde)之间的个数,忽略了bcde本身.

举一个例子:假设输入的是qqq

表面上看起来只有三位,但其实qqq前面还有qaaa,qaab,…
第一位: result += ('q' - 'a')* (25*25*25+25*25+25+1)+1
第二位:result += ('q' - 'a')*(25*25+25+1)+1
第三位:result += ('q' - 'a')*(25+1)+1
最终结果是result-1
之所以减1是因为Index是从0开始的,result计算的是从a到qqq的个数,所以减1

代码:

import java.util.Scanner;
import java.math.*;
public class Main{
    public static void main(String[]args){
        Scanner scan = new Scanner(System.in);
        String code = scan.next();
        char[] str = code.toCharArray();
        int result = 0, i = 0;
        while(i < str.length){
            int tmp = 0;
            switch(4-i){//不论输入的字符是几位,第一位对应case4,第二位(如果有)对应case3,...
                case 4 : tmp = (int)Math.pow(25,3) + 25*25 + 25 + 1;
                    break;
                case 3 : tmp = 25*25 + 25 + 1;
                    break;
                case 2 : tmp = 25 + 1;
                    break;
                case 1 : tmp = 1;
                    break;
                default : break;
            }
            result += (str[i] - 'a') * tmp+1;//每一个加一是因为switch的计算是计算str[i]前面的所有可能,没有考虑等于时的四种情况.
            i++;
        }
        System.out.println(result-1);//之所以减1是因为Index是从0开始的.
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值