📜  门| GATE-IT-2004 |问题3(1)

📅  最后修改于: 2023-12-03 14:58:32.945000             🧑  作者: Mango

GATE-IT-2004 Problem 3

本题是一个编程题,要求实现一个短网址生成器。

问题描述

短网址就是将长的网址转换为短的网址,使得用户更容易记忆和使用。例如,将 https://www.google.com/search?q=python 转换为 http://tinyurl.com/4e9iAk。

你需要实现两个函数:

  1. encode(longUrl: str) -> str:将长网址转换为短网址。

  2. decode(shortUrl: str) -> str:将短网址还原为原来的长网址。

在实现时需要考虑以下问题:

  1. 长网址可以是任意的字符串,包括字母、数字和特殊字符。

  2. 短网址长度应当尽量短,但不能重复。

  3. 短网址必须唯一对应一个长网址。

  4. 编码和解码操作必须快速且可逆。

解题思路

要实现短网址生成器,可以使用哈希表来进行映射。具体的实现思路为:

  1. 创建一个哈希表 url_map,用于存储所有的映射关系。

  2. 对于长网址 longUrl,使用哈希函数生成其哈希值 hash_val

  3. 判断哈希值 hash_val 是否已经在哈希表 url_map 中存在,如果存在,则表示该长网址已经生成过短网址,直接返回对应的短网址;否则,继续执行步骤4。

  4. 从一个预定义的字符集中,选取 k 个字符,将它们组成新的短网址 shortUrl。其中,k 的取值根据要求来确定,比如要求短网址长度不超过 6,则 k 为 6。然后将短网址 shortUrl 作为 key,将长网址 longUrl 作为 value 存储到哈希表 url_map 中。

  5. 将短网址 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
总结

本题通过使用哈希表来实现了一个简单的短网址生成器,可以很好地解决短网址的生成和还原问题。通过本题的练习,可以更好地掌握哈希表的使用方法和编程技巧。