题目
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.
问题解答:
方法1:【使用随机算法】
参考:https://leetcode.com/problems/encode-and-decode-tinyurl/discuss/100268/Two-solutions-and-thoughts
class Codec:
alphabet = string.ascii_letters + '0123456789'
def __init__(self):
self.url2code = {}
self.code2url = {}
def encode(self, longUrl):
while longUrl not in self.url2code:
code = ''.join(random.choice(Codec.alphabet) for _ in range(6))
if code not in self.code2url:
self.code2url[code] = longUrl
self.url2code[longUrl] = code
return 'http://tinyurl.com/' + self.url2code[longUrl]
def decode(self, shortUrl):
return self.code2url[shortUrl[-6:]]
解释:(很精致的分析)
It's possible that a randomly generated code has already been generated before. In that case, another random code is generated instead. Repeat until we have a code that's not already in use. How long can this take? Well, even if we get up to using half of the code space, which is a whopping 626/2 = 28,400,117,792 entries, then each code has a 50% chance of not having appeared yet. So the expected/average number of attempts is 2, and for example only one in a billion URLs takes more than 30 attempts. And if we ever get to an even larger number of entries and this does become a problem, then we can just use length 7. We'd need to anyway, as we'd be running out of available codes.
方法2:利用map,与累加
import java.util.HashMap;
import java.util.Map;
public class Codec {
protected Map<String,String> map = new HashMap<>();
protected Integer key = 0;
// Encodes a URL to a shortened URL.
public String encode(String longUrl) {
map.put(String.valueOf(++key),longUrl);
return String.valueOf(key);
}
// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
return map.get(shortUrl);
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.decode(codec.encode(url));