2017騰訊秋招筆試題之編碼

Description: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
數組

Input:ide

   輸入一個待編碼的字符串,字符串長度小於等於100
函數

Output:優化

   輸出這個編碼的index
編碼

Example: 
spa

   Input: bcac     Output: 16331code


   看到題目第一時間實際上是沒有看懂的,沒看出來題目中提到的編碼有什麼規律。仔細分析一下,按照題目要求:排序

Index(a) = 0; Index(aa) = 1; Index(aaa) = 2; Index(aaaa) = 3; Index(aaab) = 4 ...ip

既然已經知道初始值,那咱們能夠利用這些已有的Index去推算相鄰的字符編碼,從低位到高位:

Index(aaaa)到 Index(aaab) :base4 = 1;

Index(aaa) 到 Index(aab)  :base3 = 25*base4 + 1;

Index(aa)  到 Index(ab)   : base2 = 25*base3 + 1;

Index(a)   到 Index(b)    :base1 = 25*base2 + 1;

    知道a到b之間的推算,就很容易計算a到c,d...只須要乘以間隔就行。而後只須要按位計算每一個位上的編碼,最後將整個字符串的編碼相加就能夠了。

例如輸入: bcac

第一位b: coding1 = ('b'- 'a')*base1 + 1;

第二位c: coding2 = ('c'- 'a')*base2 + 1;

第三位a: coding3 = ('a'- 'a')*base3 + 1;

第四位c: coding4 = ('c'- 'a')*base4 + 1;

最終的編碼爲 coding = coding1+coding2+conding3+conding4-1;(減1是由於編碼是從0開始的)


源代碼(不是最優化的,只是個思路)

public class code {
    public static void main(String args[]){
        int base4 = 1;
        int base3 = 25*base4 + 1;
        int base2 = 25*base3 + 1;
        int base1 = 25*base2 + 1;
        int[] indexbox = new int[]{base1,base2,base3,base4};
        String inpt ; //input
        int oupt = 0; //output
        Scanner sc = new Scanner(System.in);
        inpt = sc.next();
        sc.close();
        char[] inpt_character = inpt.toCharArray(); //將輸入的字符串轉化成數組
        for(int i=0;i < inpt_character.length;i++){
            oupt += (int)(inpt_character[i] - 'a')*indexbox[i%4] + 1;
        
        }
        System.out.println(oupt-1);    
    }

}
相關文章
相關標籤/搜索