LeetCode 535. TinyURL 的加密与解密

news2025/7/19 4:32:14

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 <= url.length <= 104
题目数据保证 url 是一个有效的 URL

解法一:可将长url存入数据库中,id为自增主键,每次存放后会得到数据库中一个自增长的id,然后将带有该id的url作为短url:

class Solution {
public:
    Solution () {
        id = 0;
    }

    // Encodes a URL to a shortened URL.
    string encode(string longUrl) {
        db[id] = longUrl;
        string shortUrl = string("http://tinyurl.com/") + to_string(id);
        ++id;

        return shortUrl;
    }

    // Decodes a shortened URL to its original URL.
    string decode(string shortUrl) {
        int idStartIdx = shortUrl.rfind('/') + 1;
        int id = stoi(shortUrl.substr(idStartIdx, shortUrl.size() - idStartIdx));

        return db[id];
    }

private:
    int id;
    unordered_map<int, string> db;
};

// Your Solution object will be instantiated and called as such:
// Solution solution;
// solution.decode(solution.encode(url));

如果长url的长度为n,此算法中,encode方法的时间复杂度为O(n),空间复杂度为O(n);decode方法的时间复杂度为O(1),空间复杂度为O(1)。

解法二:哈希生成,选两个合适的质数k 1 _1 1=1117,k 2 _2 2=10 9 ^9 9+7,使用以下方法计算长url的哈希值:
在这里插入图片描述
然后encode函数将哈希值和长url存入数据库,并返回含有哈希值的短url。decode函数可根据短url中的哈希值从数据库中取出长url。

当发生哈希冲突时,采用线性探测再散列的方法,将key加1,直到没有冲突。相同的长url的哈希值相同,哈希冲突可能会频繁发生,为避免这一点,我们使用一个额外的哈希表记录从长url到哈希值的映射。

const long long k1 = 1117;
const long long k2 = 1e9 + 7;

class Solution {
public:

    // Encodes a URL to a shortened URL.
    string encode(string longUrl) {
        if (urlToKey[longUrl] > 0) {
            return string("http://tinyurl.com/") + to_string(urlToKey[longUrl]);
        }

        int key = 0, base = 1;
        for (char c : longUrl) {
            int key = (key + c * base) % k2;
            int base = (base * k1) % k2;
        }
        while (db.find(key) != db.end()) {
            key = (key + 1) % k2;
        }

        db[key] = longUrl;

        return string("http://tinyurl.com/") + to_string(key);
    }

    // Decodes a shortened URL to its original URL.
    string decode(string shortUrl) {
        int idStartIdx = shortUrl.rfind('/') + 1;
        int id = stoi(shortUrl.substr(idStartIdx, shortUrl.size() - idStartIdx));

        return db[id];
    }

private:
    unordered_map<int, string> db;
    unordered_map<string, int> urlToKey;
};

// Your Solution object will be instantiated and called as such:
// Solution solution;
// solution.decode(solution.encode(url));

如果长url的长度为n,此算法中,encode方法的时间复杂度为O(n),在数据量远小于10e9+7的情况下,哈希冲突很少发生,空间复杂度为O(n);decode方法的时间复杂度为O(1),空间复杂度为O(1)。

计算字符串的哈希时,类似于计算一个数字,如1234,它等于1 * 10³ + 2 * 10² + 3 * 10 + 4 * 1

解法三:随机生成,随机生成一个key,如果key已存在,则继续生成,直到出现不存在的key:

class Solution {
public:

    // Encodes a URL to a shortened URL.
    string encode(string longUrl) {
        default_random_engine e(time(0));
        uniform_int_distribution<int> u(0, INT_MAX);
        int key = u(e);
        while (db.find(key) != db.end()) {
            key = u(e);
        }

        db[key] = longUrl;

        return string("http://tinyurl.com/") + to_string(key);
    }

    // Decodes a shortened URL to its original URL.
    string decode(string shortUrl) {
        int idStartIdx = shortUrl.rfind('/') + 1;
        int id = stoi(shortUrl.substr(idStartIdx, shortUrl.size() - idStartIdx));

        return db[id];
    }

private:

    unordered_map<int, string> db;
};

// Your Solution object will be instantiated and called as such:
// Solution solution;
// solution.decode(solution.encode(url));

如果长url的长度为n,此算法中,encode方法的时间复杂度为O(n),空间复杂度为O(n);decode方法的时间复杂度为O(1),空间复杂度为O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/362397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0探索NLP——KenLM

从0探索NLP——KenLM 导航帖 前情提要 上一篇文章介绍了传统统计语言模型——NGram的原理及其平滑方式&#xff0c;本次介绍一下基于这些理论的一种实现KenLM。 常用的N-gram训练工具有SRILM、IRSTLM、BerkeleyLM和KenLM等 KenLM比SRILM晚出来&#xff0c;训练速度也更快&am…

Kaldi语音识别技术(八) ----- 整合HCLG

Kaldi语音识别技术(八) ----- 整合HCLG 文章目录Kaldi语音识别技术(八) ----- 整合HCLGHCLG 概述组合LG.fst可视化 LG.fst组合CLG.fst可视化CLG.fst生成H.fst组合HCLG.fst生成HaCLG.fst生成HCLG.fstHCLG 概述 HCLG min(det(H o min(det(C o min(det(L o G&#xff09;)))) 将…

KT1025A蓝牙音频芯片_立讯KC认证FCC测试现场整改记录

目录 一、问题说明简介 测试机构立讯反馈&#xff0c;客户寄的样板进行无线KC【韩国】测试不过&#xff0c;体现在如下两点 蓝牙部分接收杂散不过 蓝牙的发射功率偏低 2.1 单独只给蓝牙部分供电的测试图片--OK 2.2 单独给整板供电--但是使用电池供电 2.3 单独给整板供电-…

2022FALL嵌入式大纲

Jamslade 部分内容有遗漏&#xff0c;可结合 超文本 2022FALL《嵌入式系统原理》期末复习笔记 一起观看 文章目录嵌入式系统片上系统实时系统硬实时系统软实时系统伪指令DMA传输波特率单/半双/全双工通信&#xff1b;对齐/非对齐访问地址译码代码临界区RISCBIOSUARTSPII2CWDTRO…

推荐一款新的自动化测试框架:DrissionPage

今天给大家推荐一款基于Python的网页自动化工具&#xff1a;DrissionPage。这款工具既能控制浏览器&#xff0c;也能收发数据包&#xff0c;甚至能把两者合而为一&#xff0c;简单来说&#xff1a;集合了WEB浏览器自动化的便利性和 requests 的高效率。 一、DrissionPage产生背…

跳跃游戏-力扣55-java动态规划

一、题目描述给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1&#xff1a;输入&#xff1a;nums [2,3,1,1,4]输出&#xff1a;true解释&#xff1a;可以先跳…

区间合并计算问题(LC-1326、LC-1024、LC-55、LC-45)

区间合并计算问题 文章目录区间合并计算问题[1326. 灌溉花园的最少水龙头数目](https://leetcode.cn/problems/minimum-number-of-taps-to-open-to-water-a-garden/)贪心[1024. 视频拼接](https://leetcode.cn/problems/video-stitching/)[55. 跳跃游戏](https://leetcode.cn/p…

[JavaEE系列] 详解面试中HTTP协议HTTPS协议

文章目录HTTP不安全HTTPS中的加密算法对称加密非对称加密混合加密HTTPS中的摘要算法HTTPS中的数字证书SSL /TLS握手TCP建立连接&#xff08;三次握手&#xff09;三次握手中常见的面试题&#xff1a;TCP断开连接&#xff08;四次挥手&#xff09;四次挥手中常见的面试题&#x…

比亚迪决定不给日系留“活路”了

本文来源&#xff1a;品驾/ 导读 /比亚迪的战争又打响了。2月10日&#xff0c;比亚迪秦PLUS DM-i2023冠军版正式上市&#xff0c;新车虽然改动不大&#xff0c;但起步价已至99800元&#xff0c;DM-i车型价格首次下探到10万以下这个区间。这场战争有那么可怕吗&#xff1f;有人还…

JSCharting 3.4 JavaScript Crack

JSCharting 利用其 JavaScript 图表库中十多年的真实世界图表和可视化专业知识。JSCharting 拥有超过 150 种图表类型&#xff0c;提供了一整套无缝集成的产品&#xff0c;包括甘特图、组织图表、地图、日历、网格、财务、股票、微型图、迷你图和所有类型的仪表板&#xff0c;用…

【论文简述】SKFlow: Learning Optical Flow with Super Kernels(NeurIPS 2022)

一、论文简述 1. 第一作者&#xff1a;Shangkun Sun 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;NeurIPS 4. 关键词&#xff1a;光流、代价体、遮挡区域、大核卷积、跳跃连接 5. 探索动机&#xff1a;遮挡问题是光流最大的挑战之一。 现有的解决方案&#xff1a…

JavaDoc生成API文档(powernode CD2207)(内含教学视频+源代码)

JavaDoc生成API文档&#xff08;powernode CD2207&#xff09;(内含教学视频源代码) 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87473419 目录JavaDoc生成API文档&#xff08;powernode CD2207&#xff09;(内含教学视频源代…

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的gazebo仿真环境后&#xff0c;夹爪看起来…

操作系统作业

1、下列关于线程的描述中&#xff0c;错误的是A&#xff0e;内核级线程的调度由操作系统完成B&#xff0e;操作系统为每个用户级线程建立一个线程控制块C&#xff0e;用户级线程间的切换比内核级线程间的切换效率高D&#xff0e;用户级线程可以在不支持内核级线程的操作系统上实…

07- 图像上下采样及图像直方图显示 (OpenCV基础) (机器视觉)

知识重点 高斯金字塔pyrDown向下采样: dst cv2.pyrDown(img) # 每次处理后, 结果图像是原来的1/4.pyrUp 向上采样: dst cv2.pyrUp(img) # 放大图片拉普拉斯金字塔 保留的就是残差: img- PyrUp(PyrDown(img))统计直方图: hist cv2.calcHist([img], [0], None, [25…

element/tree的使用(树的多选以及回显)

获取和设置各有两种方式&#xff1a;通过 node 或通过 key。如果需要通过 key 来获取或设置&#xff0c;则必须设置node-key。 <el-tree:data"data"show-checkboxdefault-expand-allnode-key"id"ref"tree"highlight-current:props"defa…

Oracle格式化五位数字格式时间

首先五位的时间格式一般出现在Excel批量导入时&#xff0c;年月日的时间格式读取时出现可以在excel文件中复现出来&#xff0c;在Excel文件中填写时间格式2023/02/21&#xff0c;然后右键设置单元格格式就选择常规就可以显示为5位的时间格式&#xff0c;也就是说2023/02/21对应…

不要对chatgpt过度反思 第二部分

如果未来&#xff0c;它真的可以引爆下一轮科技革命&#xff0c;只要双方不存在科技代差&#xff0c;就无法阻止科技扩散。 打个比方&#xff0c;如果你本身没有网络基础&#xff0c;没有大数据&#xff0c;她确实和你无关&#xff0c;反之&#xff0c;捅破了那层窗户纸&#x…

5.9 BGP属性-local_pref

配置BGP LOCAL_PREF属性控制选路 1. 实验目的 熟悉BGP LOCAL_PREF属性控制选路的应用场景掌握BGP LOCAL_PREF属性控制选路的配置方法2. 实验拓扑 实验拓扑如图5-9所示: 图5-9:配置BGP LOCAL_PREF属性控制选路 3. 实验步骤 (…

html笔记(一)

一、html简介 什么是HTML&#xff1f; Hyper Text Markup Language 超文本标记语言 超文本&#xff1f;超级文本&#xff0c;例如流媒体&#xff0c;声音、视频、图片等。 标记语言&#xff1f;这种语言是由大量的标签组成。 任何一个标签都有开始标签和结束标签&…