每日一题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

力扣——TinyURL的加密与解密

数据结构与算法之深入解析“TinyURL加密与解密”的求解思路与算法示例

ARTS打卡计划第6周-ALGORITHM

535. Encode and Decode TinyURL