开发者社区> 李博 bluemind> 正文

[LeetCode] Encode and Decode TinyURL 编码和解码精简URL地址

简介:
+关注继续查看

Note: This is a companion problem to the System Design problem: Design TinyURL.

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,参见代码如下:

解法一:

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<string> url;
};

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

解法二:

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<string, string> short2long, long2short;
    string dict;
};

参考资料:

https://discuss.leetcode.com/topic/81637/two-solutions-and-thoughts/2

https://discuss.leetcode.com/topic/81736/c-solution-using-random-just-for-fun

本文转自博客园Grandyang,原文链接:[LeetCode] Encode and Decode TinyURL 编码和解码精简URL地址

,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python解析URL中含有特殊符号的地址
摘要 今天在用curl调用一个solr地址查询数据的时候报错,发现是因为URL地址中含有[ 中括号 导致的,既然shell的curl命令不行,想着Python的urllib包可以解析URL地址,那就尝试这个 curl 执行报错 错误的情况: root@pts/3 $ curl "http://192.168.xxx.xxx:8983/solr/core
1278 0
在AndroidStudio中配置Gradle进行 “动态编译期间,根据远程服务器地址 ,生成多类安装包”
原文地址:http://www.cnblogs.com/vir56k/p/4763810.html 需求:   在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址。
1181 0
python爬虫URL编码和GETPOST请求 | python爬虫实战之三
本节介绍了urllib.parse模块对url的编解码,以及最常用的HTTP交互数据的方法GET、POST方法的应用。
683 0
键值编码 Key-Value Coding Programming Guide
<p style="line-height:28px; margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; color:rgb(77,77,77); font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsu
1631 0
IOS使用CFURLCreateStringByAddingPercentEscapes进行URL编码
<p style="border-width:0px; padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:8px; list-style:none; text-indent:2em; color:rgb(51,51,51); font-family:宋体; font-size:14px; line-heig
1286 0
dedecms文章页调用地址(当前文章URL)如何操作?
  我们在建站时经常会在文末加一个本文地址,那么dedecms文章页如何调用当前文章URL呢?这样做的好处是增加文章的唯一标识,更进一步的做法是在head中加个cannacial标签,告诉搜索引擎url的唯一性,避免重复页面被收录。
927 0
从网上找的 visual studio 的各个版本下载地址,vs2010/vs2012/vs2013带注册码
从网上找的 visual studio 的各个版本下载地址,很全,从 6.0 一直 到 vs2013,要的拿去吧。。。Microsoft Visual Studio 6.0 下载:英文版360云盘下载:http://l11.yunpan.cn/lk/sVeBLC3bhumrI英文版115网盘下载:http://115.com/file/bew2qrau英文版迅雷下载:http://61.138
6713 0
【汇编语言/底层开发】7、更灵活的定位内存地址方法
1、[bx+idata] 通常情况下,我们使用ds和[bx]指定内存中的一个内存单元。而[bx+idata]所表示的是一种更加灵活的方式来定位内存地址,其表示的是段地址为DS,偏移地址为(bx)+idata的内存位置。
935 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18675 0
+关注
李博 bluemind
云栖社区Java、Redis、MongoDB运营小编,有意合作请联系钉钉:15810436147
2107
文章
1103
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载