给出一个长网址,返回一个短网址。
你需要实现两个方法:
longToShort(url)
把一个长网址转换成一个以http://tiny.url/
开头的短网址shortToLong(url)
把一个短网址转换成一个长网址
你可以任意设计算法,评测只关心两件事:
- 短网址的key的长度应该等于6 (不算域名和反斜杠)。 可以使用的字符只有
[a-zA-Z0-9]
. 比如:abcD9E
- 任意两个长的url不会对应成同一个短url,反之亦然。
样例
样例 1:
输入: shortToLong(longToShort("http://www.lintcode.com/faq/?id=10"))
输出: "http://www.lintcode.com/faq/?id=10"
解释:
longToShort()被调用时你可以返回任何短网址, 比如 "http://tiny.url/abcdef".
或者 "http://tiny.url/ABCDEF" 也时可以的.
样例 2:
输入:
shortToLong(longToShort("http://www.lintcode.com/faq/?id=10"))
shortToLong(longToShort("http://www.lintcode.com/faq/?id=10"))
输出:
"http://www.lintcode.com/faq/?id=10"
"http://www.lintcode.com/faq/?id=10"
解题思路:
使用一个map存储短网址与长网址的匹配关系。对于生成短网址的6个字符可采用在存储所有符合要求的char数组中随机取6个字符拼接即可。
public class TinyUrl {
private Map<String, String> map;
private char[] chars;
public TinyUrl(){
map = new HashMap<>();
chars = new char[62];
//初始化char数组
int i=0;
for(; i<10; i++)
chars[i] = (char)('0' + i);
for(; i<36; i++)
chars[i] = (char)('a' + i - 10);
for(; i<62; i++)
chars[i] = (char)('A' + i - 36);
}
/*
* @param url: a long url
* @return: a short url starts with http://tiny.url/
*/
public String longToShort(String url) {
// write your code here
String shortString = buildShortString();
if(!map.containsKey(shortString))
map.put(shortString, url);
return shortString;
}
/*
* @param url: a short url starts with http://tiny.url/
* @return: a long url
*/
public String shortToLong(String url) {
// write your code here
return map.get(url);
}
private String buildShortString(){
StringBuilder sb = new StringBuilder();
for(int i=0; i<6; i++)
sb.append(chars[(int)(Math.random()*62)]);
return "http://tiny.url/" + sb.toString();
}
}