[路飞]_程序员必刷力扣题: 535. TinyURL 的加密与解密

145 阅读2分钟

「这是我参与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)
};

谢谢大家,一起加油