题目
题目来源:力扣(LeetCode
TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk.
要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。
思路分析
- 给了一个网址,让最后输出一个短网址;这个叫加密。给了一个短网址,让最后输出它原始网 址,这个叫解密。
- 将这个长URL随机生成长度为LEN的62进制(0-9a-ZA-Z)字符串表示短URL。如果用过了就跳过继续生成,知道发现没用过的key为止
- 将这个生成的6位的随机数作为key值存储在哈希表里,然后把这个随机数作为后缀放入返回的简化 url
- 拿到简化url后提取出后6位随机数,去哈希表找到对应的长url即可
let map={};
let str="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
function getRandom(str) {
let res = "";
for (let i = 0; i < 6; i++) {
res += str[Math.floor(Math.random() * 61)];
}
return res;
}
/**
* Encodes a URL to a shortened URL.
*
* @param {string} longUrl
* @return {string}
*/
var encode = function(longUrl) {
let result = getRandom(str);
while(map[result]) {
result = getRandom(str);
}
map[result] = longUrl;
return "http://tinyurl.com/"+result;
};
/**
* Decodes a shortened URL to its original URL.
*
* @param {string} shortUrl
* @return {string}
*/
var decode = function(shortUrl) {
let key = shortUrl.slice(-6);
return map[key];
};
/**
* Your functions will be called as such:
* decode(encode(url));
*/