推荐答案
// www.javascriptcn.com code example
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ShortUrlSystem {
private Map<String, String> urlMap = new HashMap<>();
private Random random = new Random();
private static final String BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static final int SHORT_URL_LENGTH = 6;
public String generateShortUrl(String longUrl) {
String shortUrl = generateRandomString(SHORT_URL_LENGTH);
while (urlMap.containsKey(shortUrl)) {
shortUrl = generateRandomString(SHORT_URL_LENGTH);
}
urlMap.put(shortUrl, longUrl);
return shortUrl;
}
public String getLongUrl(String shortUrl) {
return urlMap.get(shortUrl);
}
private String generateRandomString(int length) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(BASE62.charAt(random.nextInt(BASE62.length())));
}
return sb.toString();
}
public static void main(String[] args) {
ShortUrlSystem system = new ShortUrlSystem();
String longUrl = "https://www.example.com";
String shortUrl = system.generateShortUrl(longUrl);
System.out.println("Short URL: " + shortUrl);
System.out.println("Long URL: " + system.getLongUrl(shortUrl));
}
}本题详细解读
1. 系统设计思路
短链接系统的核心是将一个长的URL映射到一个短的URL上。这个映射关系需要存储在内存或数据库中,以便后续可以通过短URL快速找到原始的长URL。
2. 数据结构选择
- HashMap:用于存储短URL和长URL之间的映射关系。HashMap的查找和插入操作的时间复杂度为O(1),非常适合这种场景。
- Random:用于生成随机的短URL字符串。
3. 短URL生成算法
- Base62编码:使用0-9、A-Z、a-z共62个字符来生成短URL。这样可以保证生成的短URL尽可能短且唯一。
- 随机生成:通过随机生成6个字符的字符串作为短URL。如果生成的短URL已经存在,则重新生成,直到找到一个唯一的短URL。
4. 主要方法
- generateShortUrl(String longUrl):生成一个短URL,并将其与长URL的映射关系存储在HashMap中。
- getLongUrl(String shortUrl):根据短URL查找对应的长URL。
- generateRandomString(int length):生成指定长度的随机字符串。
5. 扩展性考虑
- 持久化存储:在实际应用中,可能需要将URL映射关系存储在数据库中,以便系统重启后数据不丢失。
- 分布式系统:在高并发场景下,可能需要使用分布式缓存或数据库来存储URL映射关系,以提高系统的性能和可扩展性。
- URL校验:在生成短URL之前,可以对长URL进行校验,确保其格式正确且有效。