腾讯---编码
騰訊—編碼
文章目錄
- 騰訊---編碼
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
假定一種編碼的編碼范圍是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輸出例子1:
16331二、分析
看到這道題是不是一臉懵逼,什么意思??什么字典序??嘿嘿。
方法一:
題目還是有依據的:
- 五筆的編碼范圍是a到y的25個字母,從1位到4位的編碼, 如果將五筆的編碼按字典序排序,形成數組如下:a, aa, aaa,aaaa, aaab, aaac, …, b, ba, baa, baaa, baab…yyyx, yyyy
- 不過還是有些難懂,這個字典序
- 首先 可以分成25個大塊,每塊是以字母a-y開頭(x不是字母x是叉,代表空,不滿四個字符的情況)
- 第一大塊包含多少個呢?
- 如果長度是4,說明都不包含空(x)第一位已經確定,就是a還有三位可選(選25個字母之一),就是25 * 25 * 25
- 長度是3說明有一個空,25*25
- 長度為2,兩個空只剩一個位置可以是25個字母中任意一個,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
方法二:
給一個例子:
dbc
這是一個3位串,算一下有多少種組合能小于它:
- 1)1位串。(d-a)+1種,第1位可以選[a,d),再加上d本身。
- 2)2位串。(d-a)*25+(b-a)+1種,第1位選[a,d)那么第2位可以選25種,第1位選d那么第2位只能選[a,b),再加上db本身 。
上面是串長小于3的時候。
- 3)3位串。(d-a)*25^2+(b-a)*25+(c-a)種,計算方法和上述相同。但是因為串長相同,所以dbc本身不能要,不用+1。
下面是大于串長的情況。
- 4)4位串。(d-a)*25^3+(b-a)*25^2+(c-a)*25種,相當于在3位串的基礎上乘25。串的前綴相同,較長的串要排后面,所以不能要。
小于dbc的情況就是上述4種情況之和,對于每個串都計算這4種情況。觀察4個和的規律,可以利用已有結果避免重復計算。
三、代碼
方法一:
#include <iostream> #include <string> using namespace std;//25 * 25 * 25 + 25 * 25 + 25 + 1 //25 * 25 + 25 + 1 //25 + 1 //1 const int arr[] = {16276, 651, 26, 1};int main() {string s;cin>>s;int ans = 0;for(int i = 0; i < s.length(); i++){int if_1 = 1;if(i == 0) if_1 = 0;ans += (s[i]-'a') * arr[i] + if_1;}printf("%d\n", ans);return 0; }方法二:
#include <iostream> #include <string> using namespace std;int main() {string s;cin>>s; int n = s.size();//用curSum來保存已有計算結果//sum計算4種情況之和int sum = 0, curSum = 0;for (int i = 0; i < 4; ++i) {curSum *= 25;if (i < n) {curSum += s[i] - 'a';}sum += curSum;if (i < n - 1) {sum += 1;}}cout<<sum;return 0; }總結
- 上一篇: 腾讯---画家小Q
- 下一篇: 腾讯---生成格雷码