题解 | #某度短网址#

某度短网址

https://www.nowcoder.com/practice/4aee5c3a31be4b3a9fe0181778ded0ab

吐槽:其实很简单,只不过题目有坑!!!题目中的key起始值为1,但换成0后才能过~~
思路:
1. 用一个long,string类型的hash表存放key和长网址的映射关系
2. 用一个string,long类型的hash表存放短网址最后6位与长网址的key的映射关系
3, 计算key、使用key计算短网址
4. 遍历整个输入数组,使用长网址生成短网址,并保存key->长网址,短网址->key的映射关系
5. 遍历短网址,找到最后的6个字符,在hash表中找到对应的key,然后通过另一个hash表取出原始的长网址
class Solution {
public:
vector<string> urlTransformation(vector<string> &long_url, vector<string> &short_url)
{
  static long mod = 56800235584;
  static std::string table = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  std::unordered_map<long, std::string> key_long_hash;  // key和长网址绑定
  std::unordered_map<std::string, long> short_key_hash; // 短网址和key绑定
  auto generate_short_url = [](long key)
  {
    std::string url(6, '0');
    int index = 6;
    while (key > 0)
    {
      url[--index] = table[key % 62];
      key /= 62;
    }
    return url;
  };

  auto calc_key = [&key_long_hash](const std::string &url) -> long
  {
    long key = 0;
    for (auto c : url)
    {
      key = (key * 64 + c) % mod;
    }

    while (key_long_hash.find(key) != key_long_hash.end())
    {
      key = (key + 1) % mod;
    }
    return key;
  };

  std::vector<std::string> ans;
  std::string prefix = "http://tiny.url";
  for (auto &url : long_url)
  {
    long key = calc_key(url);
    auto s = generate_short_url(key);
    key_long_hash[key] = url;
    short_key_hash[s] = key;
    ans.push_back(prefix + s);
  }

  for (auto &url : short_url)
  {
    auto pos = url.find(prefix);
    if (pos == url.npos)
    {
      continue;
    }
    auto s = url.substr(pos + prefix.size());
    if (short_key_hash.find(s) != short_key_hash.end())
    {
      ans.push_back(key_long_hash[short_key_hash[s]]);
    }
  }
  return ans;
}
};


全部评论
赞,输入测试用例时发现不对劲,还好看了一下题解。巨坑:key应该从0开始!
点赞 回复 分享
发布于 2022-08-14 19:12

相关推荐

11-09 01:22
已编辑
东南大学 Java
高级特工穿山甲:羡慕,我秋招有家企业在茶馆组织线下面试,约我过去“喝茶详谈”😢结果我去了发现原来是人家喝茶我看着
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务