leetcode刷题记录-535. TinyURL 的加密与解密

163 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

前言

今天的题目为中等,题目的意义不大,只是考察加密的算法,当然懂得比较高深的加密算法的也能够使用,不行的话最简单的随机数也是可以的。

每日一题

今天的题目是 535. TinyURL 的加密与解密,难度为中等

  • TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL leetcode.com/problems/de… 时,它将返回一个简化的URL tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。

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

  • 实现 Solution 类:

  • Solution() 初始化 TinyURL 系统对象。

  • String encode(String longUrl) 返回 longUrl 对应的 TinyURL 。

  • String decode(String shortUrl) 返回 shortUrl 原本的 URL 。题目数据保证给定的 shortUrl 是由同一个系统对象加密的。  

示例:

输入:url = "https://leetcode.com/problems/design-tinyurl"
输出:"https://leetcode.com/problems/design-tinyurl"

解释:
Solution obj = new Solution();
string tiny = obj.encode(url); // 返回加密后得到的 TinyURL 。
string ans = obj.decode(tiny); // 返回解密后得到的原本的 URL 。

 

提示:

  • 1 <= url.length <= 104
  • 题目数据保证 url 是一个有效的 URL

题解

哈希表

一开始看题目很懵逼,不知道题目要做什么,看了解析后才知道,原来这道题只是进行网址的一个简化服务,俗称就是长网址转化为短网址,示例中的 4e9iAk 这个六个字符是随机生成的,并不是说有着什么规律,题目的那个网址就一定对应这六个字符,并不是,只是每个网址需要随机出六个字符,并且这六个字符就指向该网址,这样在解密的时候,还是能够通过这六个字符去找到该网址。并且可以简单地通过判断哈希表中是否存在随机出来的随机数来判断是否重复,以此来解决重复的问题,重复了直接在随机一次,然后通过哈希表进行原网址和随机字符的相互匹配。

let map = new Map();
let str = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
function getRandom(str: string): string {
    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.
 */
function encode(longUrl: string): string {
    let result = getRandom(str);
    while (map.has(result)) {
        result = getRandom(str)
    }

    map.set(result, longUrl)
    return "http://tinyurl.com/" + result;
};

/**
 * Decodes a shortened URL to its original URL.
 */
function decode(shortUrl: string): string {
    let key = shortUrl.slice(-6);
    return map.get(key);
};

/**
 * Your functions will be called as such:
 * decode(encode(strs));
 */

image.png