2017校招真題 -騰訊-編碼
阿新 • • 發佈:2018-09-14
class btn -h aaa 函數 字典序排序 -o stream title
題目描述
假定一種編碼的編碼範圍是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
思路:這道題並沒有什麽太簡便的方法,就是一位一位找到比當前字符串小的字符串個數。
需要註意的就是當右側沒有字符時這個特殊情況,我先後寫了兩版代碼:
第一版:
#include<iostream> #include<string> using namespace std; int main(){ string str; cin>>str; int s = str.size(); if(s == 1){ int res = 0; res += (str[0] - ‘a‘)*25*25*25 + (str[0] - ‘a‘)*25*25 + (str[0] - ‘a‘)*25; res += str[0] - ‘a‘; cout<<res; }else if(s == 2){ int res = 0; res += (str[1] - ‘a‘)*25*25 + (str[1] - ‘a‘)*25; res += str[1] - ‘a‘; res += (str[0] - ‘a‘)*25*25*25 + (str[0] - ‘a‘)*25*25 + (str[0] - ‘a‘)*25; res += str[0] - ‘a‘ + 1; cout<< res; }else if(s == 3){int res = 0; res += (str[2] - ‘a‘)*25; res += str[2] - ‘a‘; res += (str[1] - ‘a‘)*25*25 + (str[1] - ‘a‘)*25; res += str[1] - ‘a‘ + 1; res += (str[0] - ‘a‘)*25*25*25 + (str[0] - ‘a‘)*25*25 + (str[0] - ‘a‘)*25; res += str[0] - ‘a‘ + 1; cout<< res; }else{ int res = 0; res += str[3] - ‘a‘; res += (str[2] - ‘a‘)*25; res += str[2] - ‘a‘ + 1; res += (str[1] - ‘a‘)*25*25 + (str[1] - ‘a‘)*25; res += str[1] - ‘a‘ + 1; res += (str[0] - ‘a‘)*25*25*25 + (str[0] - ‘a‘)*25*25 + (str[0] - ‘a‘)*25; res += str[0] - ‘a‘ + 1; cout<< res; } return 0; }
第二版:
#include<string> #include<cmath> #include<iostream> #include<vector> using namespace std; int main(){ string str; cin>>str; vector<char> v (str.begin(),str.end()); v.resize(4,‘!‘); int res = 0; for(int i = 0; i < 4 ; ++i){ if(v[i] != ‘!‘){ for(int j = 1; j < 4-i; ++j) res += (v[i] - ‘a‘) *pow(25,j); if(i+1 < 4 && v[i+1] != ‘!‘) res += v[i] - ‘a‘ + 1; else res += v[i] - ‘a‘; } } cout<<res; return 0; }
2017校招真題 -騰訊-編碼