TinyURL 的加密与解密

  1. 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 是由同一个系统对象加密的。

P-题解

其实我第一时间想到的就只有异或运算而已

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

// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
return syscode(shortUrl);
}
public String syscode(String index){
int key = 114514;
char mixcode[] = index.toCharArray();
for(int i=0;i<mixcode.length;i++){
mixcode[i] = (char)(mixcode[i]^key);
}
return new String(mixcode);
}

O-题解

(来源leetcode)

自增

建立哈希表,用自增的id作为URL的键,每次接收一个URL都会使id递增,从而将键值对database进行存储,然后返回带有id的字符串作为shorURL。

public class Codec {
private Map<Integer, String> dataBase = new HashMap<Integer, String>();
private int id;

public String encode(String longUrl) {
id++;
dataBase.put(id, longUrl);
return "http://tinyurl.com/" + id;
}

public String decode(String shortUrl) {
int p = shortUrl.lastIndexOf('/') + 1;
int key = Integer.parseInt(shortUrl.substring(p));
return dataBase.get(key);
}
}

哈希生成

public class Codec {
static final int K1 = 1117;
static final int K2 = 1000000007;
private Map<Integer, String> dataBase = new HashMap<Integer, String>();
private Map<String, Integer> urlToKey = new HashMap<String, Integer>();

public String encode(String longUrl) {
if (urlToKey.containsKey(longUrl)) {
return "http://tinyurl.com/" + urlToKey.get(longUrl);
}
int key = 0;
long base = 1;
for (int i = 0; i < longUrl.length(); i++) {
char c = longUrl.charAt(i);
key = (int) ((key + (long) c * base) % K2);
base = (base * K1) % K2;
}
while (dataBase.containsKey(key)) {
key = (key + 1) % K2;
}
dataBase.put(key, longUrl);
urlToKey.put(longUrl, key);
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);
}
}