LeetCode 解題思路:535.Encode and Decode TinyURL

來源:互聯網
上載者:User

標籤:多次   and   algo   accept   div   ensure   進位   order   http   

TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iAk.

Design the encode and decode methods for the TinyURL service. There is no restriction on how your encode/decode algorithm should work. You just need to ensure that a URL can be encoded to a tiny URL and the tiny URL can be decoded to the original URL.

題意就是對url設計編碼和解碼,使長url變成短url。沒有嚴格限制編解碼演算法,只要能保證長短url可以互相轉換。

基本思路:

  encode:根據url產生一個序號,將url用vector或unordered_map儲存在該序號對應項中,返回string為http://tinyurl.com/+序號

  decode:從短網址中拿到序號,從容器中找到對應序號項。

簡單的例子:用longUrl在vector中的儲存位置做標識  

 1 class Solution { 2 public: 3  4     // 編碼:長變短 5     string encode(string longUrl) { 6         url.push_back(longUrl); 7         return "http://tinyurl.com/" + to_string(url.size() - 1); 8     } 9 10     // 解碼:短變長11     string decode(string shortUrl) {12         size_t pos = shortUrl.find_last_of("/");13         return url[stoi(shortUrl.substr(pos + 1))];14     }15 private:16     vector<string> url;17 };

但是和題目給的不一樣怎麼辦?有一個小方案,和解題無關,單純說一下怎麼去設計tinyurl,只有思路沒有寫代碼。

基本思路不變,仍然儲存在容器中,或者調用介面寫在資料庫/redis中。

編碼:使用題目 “4e9iAk“ 這樣的編碼可以認為將URL換成一個 0 ~ 9  + ‘A’ ~‘Z’ + ‘a’ ~ ‘z’ 換成一個5位62進位的數,這樣每個url儲存一次, 總共可以儲存62^5 =916132832 個不同的url,最後一位另有他用;

可以將url用雜湊函數(自己寫)變成一個整型數(<916132832),將網址儲存在容器中這個整形數所對應的位置,並且將這個整型數變成一個62進位數;

最後一位預設為0,如果這個位置已經有了一個地址,就位移62位,如果還被佔用,將位移62*2個依次類推,用最後一位紀錄到底位移了幾次;

如果位移了很多次仍然沒找到位置(那得已經儲存了很多),判斷下當前容器大小是否超過容器一半,如果是就擴容,如果否,就將原雜湊值加在url後面再進行一次雜湊計算,用新的雜湊值儲存這條url。

解碼:按照編碼規則反解成整型數,然後把容器/資料庫中網址取出。

 

還有一個取巧的方法,分享給一些只求過的同學,當然也不是不好,因為題目沒有具體的要求,可以accept。

class Solution {public:    string encode(string longUrl) {        return longUrl;    }    string decode(string shortUrl) {        return shortUrl;    }};

 

LeetCode 解題思路:535.Encode and Decode TinyURL

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.