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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

腾讯面试算法题——编码

發布時間:2023/12/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 腾讯面试算法题——编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述 假定一種編碼的編碼范圍是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開頭的所有編碼占用了連續的一段數組空間(其他字母同理),所以聯想到樹。

然后先構建一個由25棵樹組成的森林,根節點分別為a、b、c…y,每棵樹都是高度為3的滿25叉樹,子節點分別為a、b、c…y。如下圖所示(有些b與y之間忘了打省略號請忽略)。

從第一棵樹的根節點開始至各個節點的路徑便為編碼順序,以第一棵樹為例為a、aa、aaa、aaaa、aaab…ayyy,緊接第二棵樹為b、ba、baa、baaa……byyy,最終達到yyyy。

?

下面開始聯系題目。以baca為例,編碼即為根節點為b的樹和其子節點a及下一層子節點c及再下一層子節點a所組成路徑的左側節點個數(包括b、a、c、a四個節點)減一(因為a的編碼為0)。如下圖所示。

這時候,問題就由求解編碼,變為了計算這條線左端所有節點的個數和。

我們假設輸入字符串為S0S1S2S3共計四個字符。

那么第一層的個數和便為:S0 - 'a' + 1

第二層個數和為:(S0 - 'a')* 25^1 + (S1 - 'a' + 1)

第三層個數和為:(S0 - 'a')* 25^2 + (S1 - 'a') * 25^1 + (S2 - 'a' + 1)

第四層個數和為:(S0 - 'a')* 25^3 +?(S1 - 'a') * 25^2 + (S2 - 'a')?* 25^1 + (S3 - 'a' +1)

計算過程中注意判斷S1、S2、S3是否存在,不存在時將對應的小的計算塊置為0。

?

廢話少說,下面上代碼(考慮到擴展性,增加了size變量,表示題目中規定的編碼字符串最大長度)。

import java.util.*; import java.math.*;public class Main{public static void main(String[] args){Main object = new Main();Scanner sc = new Scanner(System.in);while(sc.hasNext()){String s = sc.nextLine();int index = object.encode(s, 4);if(index < 0){System.out.println("輸入數據格式有誤");}else{System.out.println(index);}}sc.close();}public int encode(String s, int size){int index = -1;int length = s.length();if(length == 0 || length > size){return index;}for(int i = 0; i < length; i++){if(s.charAt(i) < 'a' || s.charAt(i) > 'y'){return index;}}index = 0;for(int i = 0; i < size; i++){for(int j = 0; j <= i; j++){if(j < length){if(i == j){index += s.charAt(j) - 'a' + 1;}else{index += (s.charAt(j) - 'a') * Math.round(Math.pow((double)25, (double)(i - j)));}}}}return index - 1;} }

?

總結

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

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