LeetCode 每日一题——535. TinyURL 的加密与解密

1.题目描述

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 。

2.解题思路与代码

2.1 解题思路

这道题就是要生成短链接以及解析短链接。题目对短链接没要求,那么我们就可以通过使用哈希表来进行映射。首先在编码时从 a-z、A-Z、0-9 中随机抽取六位生成短链接编码,然后判断该编码是否已生成过,如果已存在则重新生成,如果不存在则将编码和原长链接放入 map 中。解码部分则根据短链接取出编码,并根据编码从 map 中取出长链接即可。

2.2 代码

public class Codec {
    private Map<String, String> map = new HashMap<>();
    private final static String TINY_URL = "http://tinyurl.com/";
    private final static String RANDOM_POOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

    // Encodes a URL to a shortened URL.
    public String encode(String longUrl) {
        String encode = null;
        do {
            encode = generate();
        } while (map.containsKey(encode));
        map.put(encode,longUrl);
        return TINY_URL+encode;
    }

    private String generate() {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            builder.append(RANDOM_POOL.charAt((int) (Math.random() * RANDOM_POOL.length())));
        }
        return builder.toString();
    }

    // Decodes a shortened URL to its original URL.
    public String decode(String shortUrl) {

        return map.get(shortUrl.substring(TINY_URL.length()));
    }
}

2.3 测试结果

通过测试

测试结果

3.总结

  • 使用随机数生成六位短链接编码
  • 使用哈希表缓存编码和长链接的映射
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值