日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

腾讯---编码

發布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 腾讯---编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

騰訊—編碼

文章目錄

    • 騰訊---編碼
    • 一、題目描述
    • 二、分析
    • 三、代碼

一、題目描述

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

總結

以上是生活随笔為你收集整理的腾讯---编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。