内容与度假的运营人员为了更好的向客户介绍商品信息,往往会在推送的商品简介末尾附带一个有关商品详情的链接。这个链接往往非常长,影响了整体内容的排版,为了给客户更好的体验,现在需要实现一个长链接转短链接的算法。该算法会将原始长链接转换成一个以"https://short.url/"开头的、后接6位映射字符的短链接。算法描述如下: ① 计算key值。key初始为1,每次与64相乘后,和网址每一位字符的ASCII值相加,并每次对56800235584取余。 ② 遇到key值冲突则每次key值加1取余,直到不冲突为止。 ③ 建立key值与6位字符的映射。每一位依次从后往前是key对62取余后在字典"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"中对应的字符,每取一次后key值整除62再取。 ④ 映射字符不够六位,前面加'0'。 输入一个字符串数组表示要映射的长地址,第二个字符串数组表示要恢复的短地址,请将长地址转换成短地址,短地址转换成长地址。(要恢复的短地址一定是第一个数组的长地址转换过去的) 示例1 输入:["http:www.baidu.com","http://www.nowcoder.com"],["http://tiny.urleNm26h"] 返回值:["http://tiny.urleNm26h","http://tiny.urlJc7hPD","http:www.baidu.com"]用java代码实现
时间: 2023-02-14 14:29:43 浏览: 84
可以使用以下的 Java 代码来实现长链接转短链接的功能。
```java
import java.util.HashMap;
import java.util.Map;
public class LongShortUrl {
// 字典
private static final String DICTIONARY = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 字典长度
private static final int DICTIONARY_LEN = DICTIONARY.length();
// 长链接的映射表
private static Map<String, String> longUrlMapping = new HashMap<>();
// 短链接的映射表
private static Map<String, String> shortUrlMapping = new HashMap<>();
/**
* 获取长链接的 key 值
*
* @param longUrl 长链接
* @return key 值
*/
private static long getKey(String longUrl) {
long key = 1;
for (char c : longUrl.toCharArray()) {
key = (key * 64 + c) % 56800235584L;
}
return key;
}
/**
* 转换成短链接
*
* @param longUrl 长链接
* @return 短链接
*/
public static String getShortUrl(String longUrl) {
// 如果长链接已经转换过,则直接返回
if (longUrlMapping.containsKey(longUrl)) {
return longUrlMapping.get(longUrl);
}
// 获取 key 值
long key = getKey(longUrl);
// 生成短链接
String shortUrl = "https://short.url/";
while (shortUrlMapping.containsKey(shortUrl)) {
// 遇到冲突,key 值加 1 并取模
key = (key + 1) % 56800235584L;
// 生成新的短链接
shortUrl = "https://short.url/";
long k = key;
// 生成映射字符串
for (int i = 0; i < 6; i++) {
shortUrl += DICTIONARY.charAt((int) (k % DICTIONARY_LEN));
k /= DICTIONARY_LEN;
}
}
阅读全文