每日一题535. TinyURL 的加密与解密
Posted 王六六的IT日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题535. TinyURL 的加密与解密相关的知识,希望对你有一定的参考价值。
535. TinyURL 的加密与解密
参考:https://leetcode.cn/problems/encode-and-decode-tinyurl/solution/tinyurl-de-jia-mi-yu-jie-mi-by-leetcode-ty5yp/
题目:
编码与解码
TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl
时,它将返回一个简化的URL http://tinyurl.com/4e9iAk
。
请你设计一个类来加密与解密 TinyURL 。
实现 Solution 类:
- Solution() 初始化 TinyURL 系统对象。
- String encode(String longUrl) 返回 longUrl 对应的 TinyURL 。
- String decode(String shortUrl) 返回 shortUrl 原本的 URL 。题目数据保证给定的 shortUrl 是由同一个系统对象加密的。
题解:
关于短URL的常用的“加密”方法或者思想
- 自增id
String str = “你好啊,我是六六!”;
int i = str.lastIndexOf(“,”);输出的结果是3。
lastIndexOf的结果是该字符的下标。下标从0开始。
String str2 = str.substring(str.lastIndexOf(“,”));
输出的结果是:,我是六六!
substring是从该字符开始。
public class Codec
private Map<Integer, String> dataBase = new HashMap<Integer, String>();
private int id;
public String encode(String longUrl)
id++;
dataBase.put(id, longUrl);
return "http://tinyurl.com/" + id;
public String decode(String shortUrl)
int p = shortUrl.lastIndexOf('/') + 1;
int key = Integer.parseInt(shortUrl.substring(p));
return dataBase.get(key);
- 哈希生成
public class Codec
static final int K1 = 1117;
static final int K2 = 1000000007;
private Map<Integer, String> dataBase = new HashMap<Integer, String>();
private Map<String, Integer> urlToKey = new HashMap<String, Integer>();
public String encode(String longUrl)
if (urlToKey.containsKey(longUrl))
return "http://tinyurl.com/" + urlToKey.get(longUrl);
int key = 0;
long base = 1;
for (int i = 0; i < longUrl.length(); i++)
char c = longUrl.charAt(i);
key = (int) ((key + (long) c * base) % K2);
base = (base * K1) % K2;
while (dataBase.containsKey(key))
key = (key + 1) % K2;
dataBase.put(key, longUrl);
urlToKey.put(longUrl, key);
return "http://tinyurl.com/" + key;
public String decode(String shortUrl)
int p = shortUrl.lastIndexOf('/') + 1;
int key = Integer.parseInt(shortUrl.substring(p));
return dataBase.get(key);
随机生成
public class Codec
private Map<Integer, String> dataBase = new HashMap<Integer, String>();
private Random random = new Random();
public String encode(String longUrl)
int key;
while (true)
key = random.nextInt();
if (!dataBase.containsKey(key))
break;
dataBase.put(key, longUrl);
return "http://tinyurl.com/" + key;
public String decode(String shortUrl)
int p = shortUrl.lastIndexOf('/') + 1;
int key = Integer.parseInt(shortUrl.substring(p));
return dataBase.get(key);
以上是关于每日一题535. TinyURL 的加密与解密的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 535 TinyURL的加密与解密[map] HERODING的LeetCode之路
535. Encode and Decode TinyURL - LeetCode