1. 程式人生 > >2017校招真題 -騰訊-編碼

2017校招真題 -騰訊-編碼

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校招真題 -騰訊-編碼