• 【每日一题】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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 哈希生成
      在这里插入图片描述
    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    随机生成

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    后续学习规划 ----含我个人的学习路线,经历及感受
    Flask vs. Django:选择适合你的Web开发框架【第134篇—Flask vs. Django】
    使用 FVTool 进行滤波器分析
    OpenHarmony 服务编译成动态库,而不是进程,问题详解
    【Unity Shader】Unity中阴影走样的解决方案
    数据结构-作业8
    C++二级指针的指向与解引用
    Spring最佳实践: 构建高效可维护的Java应用程序
    ElasticSearch学习
    深入剖析阻塞式socket的timeout
  • 原文地址:https://blog.csdn.net/m0_58058653/article/details/125527013