TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk.
要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/encode-and-decode-tinyurl
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方法及思路
最初读题觉得很开放,但是没读懂,后来慢慢审题才知道是什么意思。其实只要找到每一个URL和TinyURL的一一对应关系就好了。我的想法就是用一个hashmap存储每一个URL和对应的TinyURL。加密方法就是在接收一个URL之后,随机生成一个8位的字符串,加在http://tinyurl.com/后面,就形成了其对应的TinyURL。解密方法就是遍历hashmap,通过TinyURL来寻找对应的URL。
随机生成字符串方法是我单独写的,从字符串"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-*/.&%$$#@"中随机抽8个字符,Math.random()方法的范围是0.0-1.0,乘以字符串的长度之后就是0-字符串的长度的随机数。
public class Codec {
// 存储原始URL与其对应的TinyURL
HashMap<String, String> url = new HashMap<>();
// Encodes a URL to a shortened URL.
public String encode(String longUrl) {
if (!url.containsKey(longUrl)) {
String tmp = "http://tinyurl.com/" + getRandomString();
url.put(longUrl, tmp);
}
return url.get(longUrl);
}
// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
String res = "";
// 查找对应TinyURL的URL
for (String str : url.keySet()) {
if (url.get(str).equals(shortUrl)) {
res = str;
}
}
return res;
}
// 生成8位随机字符串
public static String getRandomString() {
String randomStr = "";
// 随机抽取示例字符串的方式随机
String model = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-*/.&%$$#@";
for (int j = 0; j < 8; j++) {
// 随机生成model字符串内一位字符
char tmpChar = model.charAt((int) (Math.random() * model.length()));
randomStr = randomStr + tmpChar;
}
return randomStr;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.decode(codec.encode(url));
结果如下: