1. 程式人生 > >2017騰訊校招線上程式設計----編碼

2017騰訊校招線上程式設計----編碼

題目描述

假定一種編碼的編碼範圍是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

題目分析:

本題目主要需要了解題目所述的字典序。首先可以分成25個大塊,每塊是以字母a-y開頭(X代表空,紅色表示當前編碼所示字元)
這裡寫圖片描述
如果長度為4,那麼第一位確定,剩下3位一共有25 * 25 *25種情況,如果長度為3,證明有一個空,就是25 *25,長度為2,兩個空只剩一個位置可以是25個字母中的任意一個,長度是1,只剩a,這一種情況。所以一共是 25^3+25^2+25+1

例:bcd
第一位是b所以處在第二大塊,result += 1 * (25^3+25^2+25+1)
第二位是c, result += 2 *(25^2+25+1)+1
第三位是d, result += 3* (25+1)+1 (加一是因為最前面有個空)
第四位是空,不管,因為空就是第一個
result = 17658

例:defc
第一位是d所以處在第四大塊,result += 3 * (25^3+25^2+25+1)
第二位是e, result += 4 *(25^2+25+1)+1
第三位是 f, result += 5* (25+1)+1
第四位是c, result += 2* (1)+1
result = 51567

#include <stdio.h>
#include <string.h>

#define N1 1
#define N2 25
#define N3 (25 * 25)
#define N4 (25 * 25 * 25)

#define C1 N1
#define C2 (N1 + N2) #define C3 (N1 + N2 + N3) #define C4 (N1 + N2 + N3 + N4) int main() { char code[5] = {0}; scanf("%s", code); int index = 0; switch(strlen(code)){ case 4: index += C1 * (code[3] - 'a') + 1; case 3: index += C2 * (code[2] - 'a') + 1; case 2: index += C3 * (code[1] - 'a') + 1; case 1: index += C4 * (code[0] - 'a'); default: break; } printf("%d\n", index); return 0; }