# leetcode535. Encode and Decode TinyURL

## 题目要求

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

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.

## 思路和代码

```private Map<String, String> longToShortUrl = new HashMap<>();
private Map<String, String> shortToLongUrl = new HashMap<>();

private static final String SHORT\_URL\_PREFIX \= "http://tinyurl.com/";

private static final String AVAILABLE_CHARACTERS = "1234567890qwertyuiopasdfghjklzxcvbnm";

private Random random = new Random();
// Encodes a URL to a shortened URL.
public String encode(String longUrl) {
if (longToShortUrl.containsKey(longUrl)) {
return SHORT_URL_PREFIX + longToShortUrl.get(longUrl);
}
String result;
do{
result = getRandomShortUrl(6);
} while (shortToLongUrl.containsKey(result));
longToShortUrl.put(longUrl, result);
shortToLongUrl.put(result, longUrl);
return SHORT_URL_PREFIX + result;
}

// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
String shortRandomCharacters = shortUrl.replace(SHORT_URL_PREFIX, "");
return shortToLongUrl.get(shortRandomCharacters);
}

private String getRandomShortUrl(int length) {
StringBuilder sb = new StringBuilder();
while (length-- > 0) {
int randomIndex = (int)(Math.random() * AVAILABLE_CHARACTERS.length());
sb.append(AVAILABLE_CHARACTERS.charAt(randomIndex));
}
return sb.toString();
}```

0 条评论

• ### leetcode445. Add Two Numbers II

链表形式跟非链表形式的最大区别在于我们无法根据下标来访问对应下标的元素。假如我们希望从后往前对每个位置求和，则必须每次都从前往后访问到对应下标的值才可以。因此这...

• ### vue-cli的项目结构

这篇文章对纯新手友好，所以有过任何vue开发经验的人可以出门左转啦！这篇文章献给我的homie苏蕾儿童鞋，让她在学习vue项目的时候少走一点弯路（径直冲向末路哈...

• ### 跨域问题的一次深入研究

最近在业务代码中深受跨域问题困扰，因此特别写一篇博客来记录一下自己对跨域的理解以及使用到的参考资料。本文的项目背景基于vue+vuex+axios+spring...

• ### nodejs之重定向

重定向指的是通过各种方法将各种网络请求重新定个方向转到其它位置（如：网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向）。

• ### SonarQube检测出的bug、漏洞以及异味的修复整理

上面的这种bug在项目中很常见，参数都用new Object[]{}封装起来。特别是从class文件反编译回来成的java文件格式也是这样的。但是如果要消除...

• ### 小程序反编译windows辅助脚本

https://github.com/xuedingmiaojun/wxappUnpacker

• ### 13行代码实现爬取豆瓣250电影榜单

原理很简单，通过发送resquest请求获取服务器的response，再使用xpath提取其中我们需要的数据，然后保存到文件中。

• ### 【春节特辑】神奇的二进制

有 1000 个一模一样的瓶子，其中有 999 瓶是普通的水，有 1 瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在，你只有 10 只小白鼠和一星期的时...

• ### 【图像分类】 图像分类中的对抗攻击是怎么回事？

欢迎大家来到图像分类专栏，深度学习分类模型虽然性能强大，但是也常常会因为受到小的干扰而性能崩溃，对抗攻击就是专门研究如何提高网络模型鲁棒性的方法，本文简要介绍相...

• ### 前端开发该如何看待新技术

做前端开发时间久了，都会有一个基本的困惑，就是有那么多的新技术新框架，到底该如何取舍。每每一个框架还没玩熟，另一个新的又取代了它，总是感到有心无力。