535. TinyURL 的加密与解密
思路:TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk.
要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。
这算是一个开放性的题目,方法很多,这里记录一下两种解法:
方法一:用异或,某一个数两次对同一个数异或即可恢复原值,正好可以用这个技巧加密和解密:
public class Codec {
private static final int FACTOR = 20000;
public String encode(String longUrl) {
char[] chars = longUrl.toCharArray();
for (int i = 0; i < chars.length; i++) {
chars[i] = (char) (chars[i] ^ FACTOR);
}
return String.valueOf(chars);
}
public String decode(String shortUrl) {
return encode(shortUrl);
}
}
方法二:用随机法,随机生成一个字符串,用map保存这个字符串到原字符串的映射以便于解密,同时要保证生成的这个随机字符串不能在map中出现过,若其出现过则重新生成:
public class Codec {
Map<String, String> map = new HashMap<String, String>();
static final String INDEX = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
static final String TINYURL_PREFIX = "http://tinyurl.com/";
// Encodes a URL to a shortened URL.
public String encode(String longUrl) {
char[] chs = new char[6];
while(true){
for(int i = 0; i < 6; i++){
chs[i] = INDEX.charAt((int)(Math.random()*62));
}
String shortUrl = TINYURL_PREFIX + new String(chs);
if(!map.containsKey(shortUrl)){
map.put(shortUrl, longUrl);
return shortUrl;
}
}
}
// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
return map.get(shortUrl);
}
}