5 用户自定义短链接
实现一个顾客短网址,使得顾客能创立他们自己的短网址。即你需要在前文基础上再实现一个createCustom。
需实现三个方法:
- long2Short(url)把一个长网址转换成一个以http://tiny.url/开头的短网址
- short2Long(url)把一个短网址转换成一个长网址
- createCustom(url, key)设定一个长网址的短网址为http://tiny.url/+key
注意:
- long2Short生成的短网址的key的长度应该等于6 (不算域名和反斜杠)。 可以使用的字符只有[a-zA-Z0-9]。如:abcD9E
- 任意两个长的url不会对应成同一个短url,反之亦然
- 如果createCustom不能完成用户期望的设定, 那么应该返回"error", 反之如果成功将长网址与短网址对应,应该返回这个短网址
在URLTable里,直接新增一列custom_url记录对应的custom url是否可行?
不可行!对于大部分数据,该列其实都为空,就会浪费存储空间。
新增一个表,存储自定义 URL:CustomURLTable。
创建自定义短链接:在 CustomURLTable 中查询和插入
根据长链接创建普通短链接:
- 先查询CustomURLTable是否存在
- 再在URLTable查询和插入
同前文一样,用两个哈希表处理长网址和短网址之间的相互映射关系。需额外处理的是用户设定的网址与已有冲突时,需返回 “error”。注意:若用户设定的和已有恰好相同,则同样应该返回短网址。
public class TinyUrl2 { private HashMap<String,String> s2l = new HashMap<String,String>(); private HashMap<String,String> l2s = new HashMap<String,String>(); private int cnt = 0; private final StringBuffer tinyUrl = new StringBuffer("http://tiny.url/"); private final String charset = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM"; private String newShortUrl() { StringBuffer res = new StringBuffer(); for (int i = 0, j = cnt; i < 6; i++, j /= 62) res.append(charset.charAt(j % 62)); cnt++; return tinyUrl + res.toString(); } /* * @param long_url: a long url * @param key: a short key * @return: a short url starts with http://tiny.url/ */ public String createCustom(String long_url, String key) { String short_url = tinyUrl + key; if (l2s.containsKey(long_url)) { if (l2s.get(long_url).equals(short_url)) return short_url; else return "error"; } if (s2l.containsKey(short_url)) return "error"; l2s.put(long_url, short_url); s2l.put(short_url, long_url); return short_url; } /* * @param long_url: a long url * @return: a short url starts with http://tiny.url/ */ public String longToShort(String long_url) { if (l2s.containsKey(long_url)) return l2s.get(long_url); String short_url = newShortUrl(); l2s.put(long_url, short_url); s2l.put(short_url, long_url); return short_url; } /* * @param short_url: a short url starts with http://tiny.url/ * @return: a long url */ public String shortToLong(String short_url) { if (s2l.containsKey(short_url)) return s2l.get(short_url); return "error"; } }5.2 基于随机生成算法
无需做任何改动,直接把custom url当short url创建即可!
参考
- https://www.zhihu.com/question/29270034