標籤:多次 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