侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 471 篇文章
  • 累计创建 108 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【哈希表, 随机】TinyURL 的加密与解密

GabrielxD
2022-07-01 / 0 评论 / 0 点赞 / 34 阅读 / 460 字 / 正在检测是否收录...

题目

535. TinyURL 的加密与解密


TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://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

解题

方法一: 哈希表

思路

编码(encode)时:取当前时间戳为随机字符串,若在哈希表中已存在则重取,把其拼上 BASE_URL 作为短链接(shortURL),把短链接作为键,传入的原长链接作为值存入哈希表中。

解码(decode)时:从哈希表中直接取值即可。

代码

public class Codec {
    private static final String BASE_URL = "http://gabrielxd.top/shorturl/";
    private final Map<String, String> MAP;

    public Codec() {
        MAP = new HashMap<>();
    }

    // Encodes a URL to a shortened URL.
    public String encode(String longUrl) {
        String randStr;
        do randStr = String.valueOf(System.currentTimeMillis());
        while (MAP.containsKey(randStr));
        String shortURL = BASE_URL + randStr;
        MAP.put(shortURL, longUrl);
        return shortURL;
    }

    // Decodes a shortened URL to its original URL.
    public String decode(String shortUrl) {
        return MAP.get(shortUrl);
    }
}
0

评论区