题目描述:
假定一种编码的编码范围是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开始的.
}
}