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. jconsole远程连接超时问题解决方法

    根据oracle网站上的文档,本地使用jconsole没有问题.但当我从windows连接到linux时(centos5.4)时,老是连接不上). 原因是Linux上JVM给jconsole的RMI配 ...

  2. Win10安装软件时出现2502、2503错误代码的问题

    主要是权限不够,C:\Windows\temp先访问权限 找到该目录,选择temp文件夹,右键弹出快捷菜单,选择“管理员取得所有权”.确定,OK. 再安装软件OK.

  3. sosi-statistics

    set echo offset scan onset lines 150set pages 66set verify offset feedback offset termout offcolumn ...

  4. 使用DBMS_SUPPORT包

    DBMS_SUPPORT包从Oracle7.2引入,主要功能用以提供更完整的用户session跟踪信息,这个包可以通过运行 dbmssupp.sql 和 prvtsupp.plb 两个脚本来创建.该脚 ...

  5. collectionView itemW宽度计算不对

    ([[UIScreen mainScreen] bounds].size.width - 28) / 4.00 没加括号 collectioView不能正常撑开 用flowLayout 不要用 代理方 ...

  6. 【Python】海贼王取名字

    #-*- coding: UTF-8 -*- #coding==utf-8 #from selenium.webdriver.support.wait import WebDriverWait fro ...

  7. java-基础-【二】内部类与静态内部类

    一.说明 java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top lev ...

  8. 表单(下)-EasyUI Spinner 微调器、EasyUI Numberspinner 数值微调器、EasyUI Timespinner 时间微调器、EasyUI Slider 滑块

    EasyUI Spinner 微调器 扩展自 $.fn.validatebox.defaults.通过 $.fn.spinner.defaults 重写默认的 defaults. 微调器(spinne ...

  9. spark 调优概述

    分为几个部分: 开发调优.资源调优.数据倾斜调优.shuffle调优 开发调优: 主要包括这几个方面 RDD lineage设计.算子的合理使用.特殊操作的优化等 避免创建重复的RDD,尽可能复用同一 ...

  10. 离线安装部署zabbix

    一. 安装好CentOS安装过程中添加php,mariadb等所需要的依赖 二. 准备好所有所需的rpm压缩文件包在centos中解压,这里放在根目录下zabbix_rpms文件夹下 三. 安装所需r ...