博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Encode and Decode TinyURL 编码和解码精简URL地址
阅读量:6834 次
发布时间:2019-06-26

本文共 2574 字,大约阅读时间需要 8 分钟。

 

Note: This is a companion problem to the   problem:  .

TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iAk.

Design the encode and decode methods for the TinyURL service. There is no restriction on how your encode/decode algorithm should work. You just need to ensure that a URL can be encoded to a tiny URL and the tiny URL can be decoded to the original URL.

 

这道题让我们编码和解码精简URL地址,这其实很有用,因为有的链接地址特别的长,就很烦,如果能精简成固定的长度,就很清爽。最简单的一种编码就是用个计数器,当前是第几个存入的url就编码成几,然后解码的时候也能根据数字来找到原来的url,参见代码如下:

 

解法一:

class Solution {public:    // Encodes a URL to a shortened URL.    string encode(string longUrl) {        url.push_back(longUrl);        return "http://tinyurl.com/" + to_string(url.size() - 1);    }    // Decodes a shortened URL to its original URL.    string decode(string shortUrl) {        auto pos = shortUrl.find_last_of("/");        return url[stoi(shortUrl.substr(pos + 1))];    }    private:    vector
url;};

 

上面这种方法虽然简单,但是缺点却很多,首先,如果接受到多次同一url地址,仍然会当做不同的url来处理。当然这个缺点可以通过将vector换成哈希表,每次先查找url是否已经存在。虽然这个缺点可以克服掉,但是由于是用计数器编码,那么当前服务器存了多少url就曝露出来了,也许会有安全隐患。而且计数器编码另一个缺点就是数字会不断的增大,那么编码的长度也就不是确定的了。而题目中明确推荐了使用六位随机字符来编码,那么我们只要在所有大小写字母和数字中随机产生6个字符就可以了,我们用哈希表建立6位字符和url之间的映射,如果随机生成的字符之前已经存在了,我们就继续随机生成新的字符串,直到生成了之前没有的字符串为止。下面的代码中使用了两个哈希表,目的是为了建立六位随机字符串和url之间的相互映射,这样进来大量的相同url时,就不用生成新的随机字符串了。当然,不加这个功能也能通过OJ,这道题的OJ基本上是形同虚设,两个函数分别直接返回参数字符串也能通过OJ,囧~

 

解法二:

class Solution {public:    Solution() {        dict = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";        short2long.clear();        long2short.clear();        srand(time(NULL));    }    // Encodes a URL to a shortened URL.    string encode(string longUrl) {        if (long2short.count(longUrl)) {            return "http://tinyurl.com/" + long2short[longUrl];        }        int idx = 0;        string randStr;        for (int i = 0; i < 6; ++i) randStr.push_back(dict[rand() % 62]);        while (short2long.count(randStr)) {            randStr[idx] = dict[rand() % 62];            idx = (idx + 1) % 5;        }        short2long[randStr] = longUrl;        long2short[longUrl] = randStr;        return "http://tinyurl.com/" + randStr;    }    // Decodes a shortened URL to its original URL.    string decode(string shortUrl) {        string randStr = shortUrl.substr(shortUrl.find_last_of("/") + 1);        return short2long.count(randStr) ? short2long[randStr] : shortUrl;    }    private:    unordered_map
short2long, long2short; string dict;};

 

参考资料:

 

转载地址:http://jptkl.baihongyu.com/

你可能感兴趣的文章
《HelloGitHub》之GitHub Bot
查看>>
node.js常见的一些错误信息
查看>>
[LintCode] Longest Increasing Continuous Subsequence 最长连续递增子序列
查看>>
华为的端口范围配置命令
查看>>
CVE-2014-4114 和 CVE-2014-3566
查看>>
数学图形(1.29) cochleoid曲线
查看>>
Claims-Based Authentication and Authorization
查看>>
Oracle11g中数据的倒库和入库操作以及高版本数据导入低版本数据可能引发的问题...
查看>>
计算机的鼻祖---差分机的由来
查看>>
责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
查看>>
Maven聚合项目在eclipse中显示没有层次
查看>>
牛人博客
查看>>
PowerShell文件系统(一)前言
查看>>
【Nodejs】理想论坛帖子爬虫1.02
查看>>
about reviewboard stack information
查看>>
第20章 数据库操作----JDBC概述
查看>>
js 取父级 页面上的元素
查看>>
XQuery的sql:variable() 函数
查看>>
阿里、有道科大讯飞齐为荣耀Magic2打call,透露YOYO想不到的技能
查看>>
微服务在微信的架构实践
查看>>