2018-03-09 15:19:04

TinyURL,短地址,或者叫短链接,指的是一种互联网上的技术与服务。此服务可以提供一个非常短小的URL以代替原来的可能较长的URL,将长的URL地址缩短。

用户访问缩短后的URL时,通常将会重定向到原来的URL。

大多数的URL缩短服务都提供有API。URL缩短服务在Twitter等一些每条消息有字数限制的微博客及其他社交网络中有广泛的使用。

一、TinyURL的兴起原因

由于某些类似于Twitter的微博客服务对于每条贴子或消息有字数限制(多为140字)。某些BBS文章超过一行78个字符时,也会造成一些会自动为网址加上超链接的Telnet及BBS软件无法正确运行该动作,因此需要通过缩短网址的功能来达到网址缩短的目的。

缩址另外也有方便用户记忆及发送网址的功能,短址可将太长的网址转换成15个字以内的替代网址,也有部分网站提供自定义名称以及密码保护的功能,可以让用户获取更有自己风格的短网址。

二、实现算法

问题描述:实现一个算法,将长地址转成短地址。实现长和短一一对应。然后再实现它的逆运算,将短地址还能换算回长地址。

问题求解:

方法一、使用最简单的列表来进行保存,当前的附加位就是其在列表中的序号。这种方法可以很容易的实现长短的转换,但是也有明显的不足。

  • 如果我们对同一URL多次进行申请,可以得到多个不同的短链接,这无疑会造成浪费。
  • 使用者可以发现已经有多少URL进行过转换了,这个信息是我们不希望用户得到的。
  • 或许有人会为了得到一个喜欢的数字,反复不断的进行申请
  • 如果仅仅使用数字的话,那么6位数字的表达能力是很差的,最多也就是百万级别,如果加入字母的话效果会好很多。
class Codec:

    def __init__(self):
self.urls = [] def encode(self, longUrl):
self.urls.append(longUrl)
return 'http://tinyurl.com/' + str(len(self.urls) - 1) def decode(self, shortUrl):
return self.urls[int(shortUrl.split('/')[-1])]

方法二、

针对上面提出的各种问题,我们在方法二中会一一解决。

首先是重复问题,对于已经生成的短链接,我们会维护一个longToTiny的hash表,如果当前的长链接已经出现了,那么就直接返回之前生成的TinyURL。

然后是数字的信息泄漏问题,我们这里使用随机数的方法来生成6位的随机数,这里的6位能表达的范围位62^6,是个非常庞大的数字。

最后是使用随机数可能会生成一样的序列,于是采用一个Set来保存已经出现的序列,直到生成未出现的序列。

public class TinyURL {
Map<String, String> tinyToLong = new HashMap<String, String>();
Map<String, String> longToTiny = new HashMap<>();
Set<String> flag = new HashSet<>(); // Encodes a URL to a shortened URL.
public String encode(String longUrl) {
if (longToTiny.containsKey(longUrl)) return longToTiny.get(longUrl);
String code = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String base = "http://tinyurl.com/";
String key = "";
do {
for (int i = 0; i < 6; i++) {
key += code.charAt((int)Math.random() * code.length());
}
} while (flag.contains(key));
flag.add(key);
tinyToLong.put(base + key, longUrl);
longToTiny.put(longUrl, base + key);
return base + key;
} // Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
return tinyToLong.get(shortUrl);
}
}

TinyURL的更多相关文章

  1. 短地址TinyURL的API使用

    TinyURL的短地址服务超过10年了,很稳定,官方没有给出API连接,其实很简单: API: 调用:http://tinyurl.com/api-create.php?url=http://URL, ...

  2. TinyURL缩短网址服务 - Blog透视镜

    TinyURL是个缩短网址服务的网站,提供1个短网址转向指定到长网址,像是杂志书籍中若有网址太长,也都会用TinyURL来缩短网址,例如本篇文章:http://blog.openyu.org/2014 ...

  3. [leetcode-535-Encode and Decode TinyURL]

    TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi ...

  4. [LeetCode] Design TinyURL 设计精简URL地址

    Note: For the coding companion problem, please see: Encode and Decode TinyURL. How would you design ...

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

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

  6. Encode and Decode TinyURL

    TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi ...

  7. Leetcode: Encode and Decode TinyURL

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

  8. 短网址服务(TinyURL)生成算法

          前不久做了一个优惠劵的分享功能,其中一个功能就是生成一个优惠劵分享短链接.生成的短链接要求每个链接都是唯一的,并且长度尽可能短.在网上查了一下相关的思路,发现了一个不错的算法.这个算法的思 ...

  9. 【Leetcode】535. Encode and Decode TinyURL

    Question: TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/pro ...

随机推荐

  1. SVN常见问题及解决方法(转载)

    svn常见符号 黄色感叹号(有冲突):--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你 ...

  2. js获取元素的外链样式

    一般给元素设置行内样式,如<div id="div1" style="width:500px;"></div>.如要获取它的样式,即可d ...

  3. yii2GridView的简单使用

    GridView::widget([ 'dataProvider' => $dataProvider,// 你传过来的ActiveDataProvider // 'filterModel' =& ...

  4. mysql添加federated引擎实现dblink远程表访问

    查看mysql数据库federated引擎是否开启. show engines; 若没有开启federated则在mysql配置文件my.cnf中mysqld中添加federated. 在远程数据库中 ...

  5. Modulo operation

    Modulo operation - Wikipedia https://en.wikipedia.org/wiki/Modulo_operation https://baike.baidu.com/ ...

  6. 通过 微软 pai-fs 上传数据到HDFS (Microsoft OpenPAI)

    准备环境 (个人使用记录,方便下次使用查阅~~) 首先保证PAI是登陆状态: 进入GitHub项目所在地址: https://github.com/Microsoft/pai/ 然后切换分支到  具体 ...

  7. CentOS7 安装mysql-5.7.10(glibc版)

    groupadd mysql useradd -r -g mysql mysql 修改mysql目录及子文件属主和属组 chown -R mysql:mysql mysql shell> cd ...

  8. Linux下编译安装MySQL5.6

    [准备工作] 所有操作需要在root用户下 本机测试案例系统信息:centos7.3 安装路径:/usr/local/mysql [安装MySQL] 先安装如下依赖包: $ yum -y instal ...

  9. HDU2426:Interesting Housing Problem(还没过,貌似入门题)

    #include <iostream> #include <queue> #include <stdio.h> #include <string.h> ...

  10. js动态移动滚动条至底部示例

    使用js动态移动滚动条至底部. var currentPosition,timer;  function GoBottom(){  timer=setInterval("runToBotto ...