首页 > 代码库 > LeetCode 解题思路:535.Encode and Decode TinyURL
LeetCode 解题思路:535.Encode and Decode TinyURL
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