📅  最后修改于: 2023-12-03 14:58:32.945000             🧑  作者: Mango
本题是一个编程题,要求实现一个短网址生成器。
短网址就是将长的网址转换为短的网址,使得用户更容易记忆和使用。例如,将 https://www.google.com/search?q=python 转换为 http://tinyurl.com/4e9iAk。
你需要实现两个函数:
encode(longUrl: str) -> str
:将长网址转换为短网址。
decode(shortUrl: str) -> str
:将短网址还原为原来的长网址。
在实现时需要考虑以下问题:
长网址可以是任意的字符串,包括字母、数字和特殊字符。
短网址长度应当尽量短,但不能重复。
短网址必须唯一对应一个长网址。
编码和解码操作必须快速且可逆。
要实现短网址生成器,可以使用哈希表来进行映射。具体的实现思路为:
创建一个哈希表 url_map
,用于存储所有的映射关系。
对于长网址 longUrl
,使用哈希函数生成其哈希值 hash_val
。
判断哈希值 hash_val
是否已经在哈希表 url_map
中存在,如果存在,则表示该长网址已经生成过短网址,直接返回对应的短网址;否则,继续执行步骤4。
从一个预定义的字符集中,选取 k
个字符,将它们组成新的短网址 shortUrl
。其中,k 的取值根据要求来确定,比如要求短网址长度不超过 6,则 k 为 6。然后将短网址 shortUrl
作为 key,将长网址 longUrl
作为 value 存储到哈希表 url_map
中。
将短网址 shortUrl
返回给用户即可。
解码操作与编码操作类似。只需要将短网址 shortUrl
作为 key,在哈希表 url_map
中查找对应的长网址 longUrl
即可。
参考代码如下:
class Codec:
def __init__(self):
self.url_map = {} # 哈希表,用于存储映射关系
self.chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def encode(self, longUrl: str) -> str:
# 判断长网址是否已经在哈希表中存在
if longUrl in self.url_map.values():
for key, value in self.url_map.items():
if value == longUrl:
return key
else:
# 使用哈希函数生成哈希值
hash_val = hash(longUrl) % (10 ** 9 + 7)
# 将哈希值转化为短网址
short_url = self.toBase62(hash_val)
# 将短网址和长网址存储到哈希表中
self.url_map[short_url] = longUrl
return short_url
def decode(self, shortUrl: str) -> str:
# 在哈希表中查找对应的长网址
return self.url_map.get(shortUrl, '')
def toBase62(self, val: int) -> str:
# 将整数转化为62进制
result = ''
while val > 0:
val, idx = divmod(val, 62)
result = self.chars[idx] + result
return result
本题通过使用哈希表来实现了一个简单的短网址生成器,可以很好地解决短网址的生成和还原问题。通过本题的练习,可以更好地掌握哈希表的使用方法和编程技巧。