读懂别人的思路,然后自己写一遍
题目描述
假定一种编码的编码范围是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
示例1
输入
baca
输出
16331
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
char[] charArr = in.nextLine().toCharArray();
int n = charArr.length;
//一共计算4种情况的所有和
int[] indexSum = new int[4];
//1)求前边一位串的个数
indexSum[0] = (charArr[0]-'a');//首位不包含charArr[0];
if(n > 1){//判断首位可以取到charArr[0]
indexSum[0] = indexSum[0] + 1;
}
//2)求前边2位串长所有情况
indexSum[1] = (charArr[0]-'a')*25;//首位不包含charArr[0];
//判断首位是否可以取charArr[0]
if(n > 1){
indexSum[1] += 1*(charArr[1]-'a');
}
//判断第二位是否可以取满
if(n >2){
indexSum[1] += 1;
}
//3)求3位串的情况
indexSum[2] = (charArr[0]-'a')*25*25;//首位不取满,其他位任意取
//判断首位是否能取满
if(n > 1){
indexSum[2] += 1*(charArr[1]-'a')*25;//第二位不取满
}
//判断第二位是否能取满
if(n > 2){
indexSum[2] += 1*1*(charArr[2]-'a');
}
//判断第三位是否能取满
if(n >3) indexSum[2] += 1;
//求4位串的情况
indexSum[3] = (charArr[0]-'a')*25*25*25;//首位不取满,其他位任意取
//判断首位是否能取满
if(n > 1){
indexSum[3] += 1*(charArr[1]-'a')*25*25;//第二位不取满
}
//判断第二位是否能取满
if(n > 2){
indexSum[3] += 1*1*(charArr[2]-'a')*25;
}
//判断第三位是否能取满
if(n > 3){
indexSum[3] += 1*1*1*(charArr[3]-'a');
}
//第四位不能取满,因为最大才能是4位
//输出结果
int index = 0;
for(int i : indexSum){
index += i;
}
System.out.println(index);
//需要注意的是:每中情况计算完的时候,需要判断串尾是否能取满,取满的要求是原串长度大于当前求的串情况的串长度
}
}