题目描述
TinyURL 是一种 URL 简化服务,
比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的 URL http://tinyurl.com/4e9iAk.
要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个 URL 可以被加密成一个 TinyURL,并且这个 TinyURL 可以用解密方法恢复成原本的 URL。
来源:LeetCode
思路
注释已经告诉我们将会这样decode(encode(url));调用我们的函数,并没有验证是否真的将 url 缩短了,所以这题有一个非常取巧做法,就是直接返回原 url。
但是我觉得此题本意是在考察我们对 url 压缩原理的了解,所以还是练习一下吧。
url 的压缩原理,是用0123456789qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKOLP中的随机六位字符,来映射原 url,存储在另一台服务器上,比如http://tinyurl.com/。我们拿到一个长的真实 url,需要将该 url 与生成的一个六位字符建立一个映射,当访问我们的短 url 服务时,再取出该真实 url,再去访问。
解法
const map = {};
const tinyPrefix = 'http://tinyurl.com/';
const codes = '0123456789qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKOLP';
const getRandomCode = () => {
const randomNums = Array(6)
.fill()
.map(() => Math.floor(Math.random() * 62));
return randomNums.map(num => codes[num]).join('');
};
/**
* Encodes a URL to a shortened URL.
*
* @param {string} longUrl
* @return {string}
*/
var encode = function(longUrl) {
const randomCode = getRandomCode();
map[randomCode] = longUrl;
return tinyPrefix + randomCode;
};
/**
* Decodes a shortened URL to its original URL.
*
* @param {string} shortUrl
* @return {string}
*/
var decode = function(shortUrl) {
console.log(shortUrl);
const code = shortUrl.substr(shortUrl.length - 6);
return map[code];
};
/**
* Your functions will be called as such:
* decode(encode(url));
*/