Bandizip Archiver——快速新秀的解壓壓縮工具!
編碼
描述
假定一種編碼的編碼範圍是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
解題思路:這是牛客網上騰訊的筆試題,我琢磨了很久,沒想出合適的解法,看了別人的解法,才想明白,所以把思路記錄下來,方便以後複習回顧.首先對一個給定的字串,我們需要統計前面總共出現了多少字串,由此給當前的字串確定對應的數字,以bbbb為例,我們首先看到第一個字元'b',這說明所有以'a'開頭的字串都已經在前面出現過了,總共有多少個呢?假設以'+'表示a~y的任意字元,如果以'a'開頭的字串的長度為4,即'a+++'的格式,由於後面的3個字元可以任意,因此總共有25^3個,如果長度為3,即'a++',總共有25^2個,長度為2,即'a+',總共有25個,長度為1,只有a一個,因此總共有(25^3+25^2+25+1)個,當看到第二個字元'b',說明以'ba'開頭的字元都已經在前面出現,如果長度為4,即'ba++',總共有25^2個,如果長度為3,即'ba+',總共有25,如果長度為2,即'ba',只有1個,此外,由於此時第一個字元為'b',不為空,此時第二位的字元是可以省略的,因此此時'b'也可以作為在前面出現的字串,此時總共有(25^2+25+1)+1;當看到第三個'b',說明以'bba'開頭的字元已經在前面出現,如果長度為4,即'bba+',總共有25個,如果長度為3,即'bba',此時只有1個,此外,由於前面的字元不為空,當前所在位置的字元同樣可以省略,即'bb',因此此時總共有(25+1)+1個,最後,看到第四個'b',說明以'bbba'開頭的所有字元都已經出現,有1個,而前面的字串不為空,所以當前字元可以為空,即'bbb'同樣在當前字元之前出現,此時總共有(1) + 1個.這是統計字串數目的邏輯,從頭到尾遍歷字串,然後找到當前字元與'a'之間間隔多少個字母,然後根據其位置進行判斷,如果是第1個,要乘以(25^3+25^2+25+1),如果是第二位,要乘以(25^2+25+1)再加上1,如果是第三位,要乘以(25+1)再加上1,如果是第四位,要乘以1再加上1,括號裡的數目表示的是在當前字元的後面新增其他字元的情況,不在括號裡的1表示的是不新增任何字元的情況,只有在第二位,第三位,第四位才能加上這個1,第一位的時候,由於前面沒有其他字元,當前字元不能去掉,因此不加1.最後得到的編碼轉換的程式碼如下:
程式碼
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); int res = 0; for(int i=0; i<s.length(); i++){ if(i==0) res += (s.charAt(i) - 'a') * (Math.pow(25, 3) + Math.pow(25, 2) + 25 + 1) ; if(i==1) res += (s.charAt(i) - 'a') *(Math.pow(25, 2) + 25 + 1) + 1; if(i==2) res += (s.charAt(i) - 'a') * (25 + 1) + 1; if(i==3) res += (s.charAt(i) - 'a') + 1; } System.out.println(res); } }