“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
TinyURL是一种URL简化服务, 比如:当你输入一个URL leetcode.com/problems/de… 时,它将返回一个简化的URL tinyurl.com/4e9iAk.
要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。
使用出现次序加密 [Accepted]
这种方法中,我们将当前 URL 第几个出现作为关键字进行加密,将这个出现次序看做 62 进制,并将每一位映射到一个长度为 62 位的表中对应的字母作为哈希值。此方法中,我们使用一系列整数和字母表来加密,而不是仅仅使用数字进行加密。
let chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
let map = new Map()
let count = 1
function getString() {
let c = count
let sb = ""
while (c > 0) {
c--
sb += (chars.charAt(c % 62))
c /= 62
}
return sb.toString()
}
function encode(longUrl) {
let key = getString()
map.set(key, longUrl)
count++
return "http://tinyurl.com/" + key
}
function decode(shortUrl) {
return map.get(shortUrl.replace("http://tonyurl.com/", ""))
}
表现分析
-
可加密的 URL 数目还是依赖于 int 的范围。因为相同的 count 在出现次序溢出整数范围后仍然会出现。
-
加密后 URL 的长度不一定更短,但某种程度上与 longURL 的出现次序相对独立。比方说产生的 URL 长度按顺序会是 1(62次),2(62次)。
-
这个算法的表现比较好,因为相同的加密结果只有在溢出整数后才会发生,这个范围非常大。
-
如果出现重复,下一次产生的加密结果还是能通过某种计算被预测出来。