• 【力扣每日一题】535. TinyURL 的加密与解密


    题目描述

    535. TinyURL 的加密与解密

    难度中等168

    TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。

    加密和解密算法如何设计和运作是没有限制的,你只需要保证一个 URL 可以被加密成一个 TinyURL ,并且这个 TinyURL 可以用解密方法恢复成原本的 URL 。

    实现 Solution 类:

    • Solution() 初始化 TinyURL 系统对象。
    • String encode(String longUrl) 返回 longUrl 对应的 TinyURL 。
    • String decode(String shortUrl) 返回 shortUrl 原本的 URL 。题目数据保证给定的 shortUrl 是由同一个系统对象加密的。

    示例:

    输入:url = "https://leetcode.com/problems/design-tinyurl"
    输出:"https://leetcode.com/problems/design-tinyurl"
    
    解释:
    Solution obj = new Solution();
    string tiny = obj.encode(url); // 返回加密后得到的 TinyURL 。
    string ans = obj.decode(tiny); // 返回解密后得到的原本的 URL 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    提示:

    • 1 <= url.length <= 10^4
    • 题目数据保证 url 是一个有效的 URL

    这里有一句话:加密和解密的方法没有限制,那我不加密(零加密),直接返回,岂不是也行?于是我利用这个漏洞光速过完这题。

    但还是要看一下正规解法。

    官方给了三种解法,但后两种实在是大题小做,直接用第一种类似数据库的方式存储每一次给到的url值即可。

    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
    • 23

    这里面官方写得比较正规,像一个url的样子,但由于只要返回最终原来的url,我们还可以再简单一点,直接记录id即可。

    public class Codec {
        private Map<Integer, String> dataBase = new HashMap<Integer, String>();
        private int id;
        //用哈希表存储每次遇到的url
        public String encode(String longUrl) {
            id++;
            dataBase.put(id, longUrl);
            return ""+id;
        }
    
        public String decode(String shortUrl) {        
            int key = Integer.parseInt(shortUrl);
            return dataBase.get(key);
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这道题目很容易过,但给我们的启示是如何去对一长串的url进行加密,缩短长度,方便存储。

  • 相关阅读:
    Python趣味入门10:推倒繁琐化烦为简的推导式
    如果报华为网络工程师中级培训班一般学费多少?
    什么是高企认定?高企认定的8个条件!
    Linux文件I/O与标准I/O缓冲机制及性能分析
    传奇开服教程:传奇开服在哪些网站打广告?传奇发布站打广告技巧
    操作系统 线程的创建
    .Net使用Elastic.Clients.Elasticsearch在Elasticsearch8中实现向量存储和相似度检索
    networking /etc/network/interfaces 笔记221102
    Cookie Session
    advanced installer 做包教程
  • 原文地址:https://blog.csdn.net/a534563/article/details/125514880