「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战」
面535. TinyURL 的加密与解密
TinyURL是一种URL简化服务, 比如:当你输入一个URL leetcode.com/problems/de… 时,它将返回一个简化的URL tinyurl.com/4e9iAk.
要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。
利用随机数
思路
题目中要求我们实现一个实现短链的加密和解密的操作
有题目中我们可以看出锻炼的基本组成就是数字以及大小写字母
由锻炼的加解密操作我们很容易联想到用一个随机的key来保存真是地址的方法
具体实现:
-
声明一个map用来保存短链到真实地址的映射表
-
声明随机字符串表由数组和大小写字母组成共62位
-
实现getRandomKey的逻辑,这里我们通过Math.random来生成一个随机数字,因为范围为0-1,我们乘以len,获取[0-62)的随机数并向下取整,得到0~61之间的62种整数结果,用来作为keyStr的下标,去获取对应的字符串,生成6位拼接成key并返回
-
实现encode,加密我们首先需要用getRandomKey函数获取一个随机的key,并用while循环判断map中是否已经存在,存在则重新生成,直到一个全新的key产生,将key,longUrl保存在map中,并返回新生成的短链
-
实现decode,解密就容易很多了,直接获取shortUrl中的后6位作为key,去map中找到key对应的长链返回即可
const keyStr = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ"
const map = new Map()
var getRandomKey = function(num=6){
var len = keyStr.length
var key = ''
while(num>0){
var random = Math.floor(Math.random()*len)
key+=keyStr[random]
num--
}
return key
}
var encode = function(longUrl) {
var key = getRandomKey()
while(map.has(key)){
key = getRandomKey()
}
map.set(key,longUrl)
return `http://tinyurl.com/${key}`
};
/**
* Decodes a shortened URL to its original URL.
*
* @param {string} shortUrl
* @return {string}
*/
var decode = function(shortUrl) {
var key = shortUrl.slice(-6)
return map.get(key)
};
谢谢大家,一起加油