今日力扣:leetcode-535. TinyURL 的加密与解密

221 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

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 = "leetcode.com/problems/de…" 输出:"leetcode.com/problems/de…"

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

代码

public class Codec {

    // Encodes a URL to a shortened URL.
    public String encode(String longUrl) {
        return longUrl;
    }

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

分析

其实这题做的有点偷懒了,本来是让加密解密的,我直接用return 返回了,但是也符合题意,所以也能拿到耗费时间上拿到了100%

如果正经做,思路是这样的:

方法一

  1. 加密的过程中我们leetcode.com/problems/ 直接替换成tinyurl.com
  2. 处理后边的design-tinyurl,我们可以使用一个固定的数组指定其对应的转换,如遇到特殊字符不替换,这种可以指定两个字符对应的一个字符,从而减少字符串的长度。

方法二

类似于全局id生成器,每生成一个id,我们存储到map中,解密的时候从map中获取。

  1. 类中使用一个Map的全局变量和一个id的全局变量,用于存储key:短链 value:长链

  2. 短链生成每次调用生成器,id自增,并且添加到map中即 map.put("tinyurl.com/"+"id","htt…");

    public class Codec {  //参考代码
        Map<String,String> map=new HashMap<>();
        int p=0;
        // Encodes a URL to a shortened URL.
        public String encode(String longUrl) {
            String s=String.valueOf(p);
            map.put(s,longUrl);
            p++;
            return s;
        }
    
        // Decodes a shortened URL to its original URL.
        public String decode(String shortUrl) {
            return map.get(shortUrl);
        }
    }
    

总结

其实这道题应该是从实际应用中抽象化出来的一道题,因为生产过程中,我们会用到短链生成这个业务。