本文已参与[新人创作礼]活动,一起开启掘金创作之路。
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%
如果正经做,思路是这样的:
方法一
- 加密的过程中我们leetcode.com/problems/ 直接替换成tinyurl.com
- 处理后边的design-tinyurl,我们可以使用一个固定的数组指定其对应的转换,如遇到特殊字符不替换,这种可以指定两个字符对应的一个字符,从而减少字符串的长度。
方法二
类似于全局id生成器,每生成一个id,我们存储到map中,解密的时候从map中获取。
-
类中使用一个Map的全局变量和一个id的全局变量,用于存储key:短链 value:长链
-
短链生成每次调用生成器,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); } }
总结
其实这道题应该是从实际应用中抽象化出来的一道题,因为生产过程中,我们会用到短链生成这个业务。