题目描述
535. TinyURL 的加密与解密
难度中等168
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 <= 10^4
- 题目数据保证
url
是一个有效的 URL
这里有一句话:加密和解密的方法没有限制,那我不加密(零加密),直接返回,岂不是也行?于是我利用这个漏洞光速过完这题。
但还是要看一下正规解法。
官方给了三种解法,但后两种实在是大题小做,直接用第一种类似数据库的方式存储每一次给到的url值即可。
public class Codec {
private Map<Integer, String> dataBase = new HashMap<Integer, String>();
private Random random = new Random();
public String encode(String longUrl) {
int key;
while (true) {
key = random.nextInt();
if (!dataBase.containsKey(key)) {
break;
}
}
dataBase.put(key, longUrl);
return "http://tinyurl.com/" + key;
}
public String decode(String shortUrl) {
int p = shortUrl.lastIndexOf('/') + 1;
int key = Integer.parseInt(shortUrl.substring(p));
return dataBase.get(key);
}
}
这里面官方写得比较正规,像一个url的样子,但由于只要返回最终原来的url,我们还可以再简单一点,直接记录id即可。
public class Codec {
private Map<Integer, String> dataBase = new HashMap<Integer, String>();
private int id;
//用哈希表存储每次遇到的url
public String encode(String longUrl) {
id++;
dataBase.put(id, longUrl);
return ""+id;
}
public String decode(String shortUrl) {
int key = Integer.parseInt(shortUrl);
return dataBase.get(key);
}
}
这道题目很容易过,但给我们的启示是如何去对一长串的url进行加密,缩短长度,方便存储。