以下是用 Java 语言实现的代码:
``` import java.util.HashMap;
public class ShortURL { private static final String SHORT_URL_PREFIX = "https://short.url/"; private static final int DICTIONARY_LENGTH = 62; private static final String DICTIONARY = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final long PRIME = 56800235584L; private static HashMap<String, String> longToShortMap = new HashMap<>(); private static HashMap<String, String> shortToLongMap = new HashMap<>();
public static String[] longToShort(String[] urls) {
String[] shortUrls = new String[urls.length];
for (int i = 0; i < urls.length; i++) {
String longUrl = urls[i];
if (longToShortMap.containsKey(longUrl)) {
// 如果已经被转换过,直接返回已转换的短地址
shortUrls[i] = longToShortMap.get(longUrl);
} else {
long key = 1;
// 计算 key
for (int j = 0; j < longUrl.length(); j++) {
key = (key * 64 + (long)longUrl.charAt(j)) % PRIME;
}
// 遇到 key 冲突的情况
while (shortToLongMap.containsKey(key)) {
key = (key + 1) % PRIME;
}
// 建立 key 与 6 位字符的映射
StringBuilder shortUrlBuilder = new StringBuilder();
while (key > 0) {
shortUrlBuilder.insert(0, DICTIONARY.charAt((int)(key % DICTIONARY_LENGTH)));
key /= DICTIONARY_LENGTH;
}
// 映射字符不足 6 位,前面加 0
while (shortUrlBuilder.length() < 6) {
shortUrlBuilder.insert(0, '0');
}
String shortUrl = SHORT_URL_PREFIX + shortUrlBuilder.toString();
// 更新映射表
longToShortMap.put(longUrl, shortUrl);
shortToLongMap.put(shortUrl, longUrl);
shortUrls[i] = shortUrl;
}
}
return shortUrls;
}
public static String[] shortToLong(String[] urls) {
String[] longUrls = new String[urls.length];
for (int i = 0; i < urls.length; i++) {