【路飞】算法与数据结构-TinyURL 的加密与解密

137 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

TinyURL是一种URL简化服务, 比如:当你输入一个URL leetcode.com/problems/de… 时,它将返回一个简化的URL tinyurl.com/4e9iAk.

要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。

思路

  • 参考了题解,每一个url生成一个6位的随机数作为key值存储在哈希表里,然后把这个随机数作为后缀放入返回的简化url
  • 拿到简化url后提取出后6位随机数,去哈希表找到对应的长url即可
/**
 * Encodes a URL to a shortened URL.
 *
 * @param {string} longUrl
 * @return {string}
 */
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;
}
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));
 */