哈希表题目:TinyURL 的加密与解密

这篇具有很好参考价值的文章主要介绍了哈希表题目:TinyURL 的加密与解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

标题和出处

标题:TinyURL 的加密与解密

出处:535. TinyURL 的加密与解密

难度

7 级

题目描述

要求

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

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

实现 Codec \texttt{Codec} Codec 类:

  • Codec() \texttt{Codec()} Codec() 初始化系统对象。
  • String   encode(String   longUrl) \texttt{String encode(String longUrl)} String encode(String longUrl) 根据给定的 longUrl \texttt{longUrl} longUrl 返回 shortUrl \texttt{shortUrl} shortUrl
  • String   decode(String   shortUrl) \texttt{String decode(String shortUrl)} String decode(String shortUrl) 根据给定的 shortUrl \texttt{shortUrl} shortUrl 返回原始的 longUrl \texttt{longUrl} longUrl。题目保证给定的 shortUrl \texttt{shortUrl} shortUrl 由同一个对象加密。

示例

示例 1:

输入: url   =   "https://leetcode.com/problems/design-tinyurl" \texttt{url = "https://leetcode.com/problems/design-tinyurl"} url = "https://leetcode.com/problems/design-tinyurl"
输出: "https://leetcode.com/problems/design-tinyurl" \texttt{"https://leetcode.com/problems/design-tinyurl"} "https://leetcode.com/problems/design-tinyurl"
解释:
Codec   obj   =   new   Codec(); \texttt{Codec obj = new Codec();} Codec obj = new Codec();
String   tiny   =   obj.encode(url); \texttt{String tiny = obj.encode(url);} String tiny = obj.encode(url); // 返回加密后的 tinyurl
String   ans   =   obj.decode(tiny); \texttt{String ans = obj.decode(tiny);} String ans = obj.decode(tiny); // 返回解密后的原始 url

数据范围

  • 1 ≤ url.length ≤ 10 4 \texttt{1} \le \texttt{url.length} \le \texttt{10}^\texttt{4} 1url.length104
  • 题目保证 url \texttt{url} url 是有效的 URL

解法

思路和算法

这道题有多种实现方法,此处提供一种简单的计数实现方法。

维护一个计数器,初始时计数器的值为 0 0 0。每次加密时,将计数器的值加 1 1 1,在一个固定的 URL 前缀后面拼接上更新后的计数器的值,即可生成加密后的 TinyURL。

为了能够从 TinyURL 解密得到原始 URL,需要使用哈希表记录 TinyURL 和原始 URL 的对应关系,因此在加密操作中生成 TinyURL 之后,需要首先将 TinyURL 和 URL 存入哈希表,然后返回 TinyURL。

由于哈希表中记录了 TinyURL 和原始 URL 的对应关系,因此在解密时,只要从哈希表中找到 TinyURL 对应的原始 URL 并返回即可。

代码

public class Codec {
    static final String SHORT_PREFIX = "https://tinyurl.com/";
    Map<String, String> map = new HashMap<String, String>();
    int count = 0;

    public String encode(String longUrl) {
        count++;
        String shortUrl = SHORT_PREFIX + count;
        map.put(shortUrl, longUrl);
        return shortUrl;
    }

    public String decode(String shortUrl) {
        return map.get(shortUrl);
    }
}

复杂度分析

  • 时间复杂度:构造方法和各项操作的时间复杂度都是 O ( 1 ) O(1) O(1)。构造方法为初始化操作,加密操作包括更新计数器、生成 TinyURL、将 TinyURL 和原始 URL 存入哈希表和返回 TinyURL,解密操作为从哈希表中得到 TinyURL 对应的原始 URL 并返回,时间复杂度都是 O ( 1 ) O(1) O(1)。这里将字符串操作的时间视为 O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是加密和解密的调用次数。需要使用两个哈希表记录每个 TinyURL 对应的原始 URL,哈希表中的元素个数取决于调用次数。

后记

除了使用计数的方法以外,这道题还有其他的实现方法,例如使用非十进制计数、随机生成加密后的 URL、使用哈希函数计算加密后的 URL 等,感兴趣的读者可以自行尝试。文章来源地址https://www.toymoban.com/news/detail-445366.html

到了这里,关于哈希表题目:TinyURL 的加密与解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 哈希表题目:LFU 缓存

    标题:LFU 缓存 出处:460. LFU 缓存 9 级 要求 请你为 最不经常使用(LFU)缓存 设计并实现数据结构。 实现 LFUCache texttt{LFUCache} LFUCache 类: LFUCache(int   capacity) texttt{LFUCache(int capacity)} LFUCache(int capacity) 用数据结构的容量 capacity texttt{capacity} capacity 初始化对象。 int   get(int  

    2024年02月07日
    浏览(34)
  • 哈希表C++哈希表详解(知识点+相关LeetCode题目)

    目录 前言 一、什么是哈希表 二、哈希表的操作 2.1 操作时间复杂度 2.2 哈希表通用API 2.3 建立哈希表 2.3 哈希表常见结构介绍 Set(集合) Map(映射) unordered_map(哈希表) 三、哈希表的力扣经典题目 有效的字母异位词242 两个数组的交集 349 两数之和1 四数相加II 454 三数之和

    2024年03月20日
    浏览(46)
  • 全面理解哈希,哈希的底层原理是如何实现的,哈希题型的做题思路与题目清单(不断更新)

    哈希(Hash)是一种算法,它接受一个输入(或“消息”),并返回一个固定大小的字符串。这个输出字符串的大小通常以字节为单位,输出的内容看起来是随机的且整个过程是单向的。 哈希的一些关键特性包括: 不管你输入的信息有多大,哈希值的大小总是固定的。 即使只

    2024年02月04日
    浏览(43)
  • RSA双向加解密(公钥加密-私钥解密;私钥加密-公钥解密)

            非对称加密算法中,提供一个公钥一个私钥。一般情况下,采用公钥加密、私钥解密的方式。         假设有这样一个场景:服务A与服务B需要通信,通信内容为了安全需要进行加密传输,并且服务A与服务B不能互相持有对方的钥匙。         我首先想到的是

    2024年02月11日
    浏览(62)
  • 必刷算法题之哈希篇(题目及代码)---C++

    解法1 :(对于大规模数据,时间和空间复杂度会超出) 解题思路如下: 假设第一个数为a,用目标值c减去第一个数a,得到b,然后遍历后面的数,查看b是否在后面的数组中 解法2 :(利用哈希表) 解法1 :(排序) 由于多数元素是指在数组中出现次数大于 【n/2】 的元素,

    2023年04月18日
    浏览(35)
  • 前端使用AES密码加密、解密,使用详细(crypto加密解密,前后端分离,AES加密解密)

    1、 首先安装 crypto-js插件,安装命令如下:    -S等同于--save,保存在package.json文件中,是在dependencies 下, --save安装包信息将加入到dependencies(生产环境)中,生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖; -D等同于--save-dev,也保存在package.j

    2024年02月11日
    浏览(61)
  • 区块链基础知识(上):区块链基本原理、加密哈希、公钥加密

    目录 基本原理 加密哈希: 公钥加密: 希望有人向你发送只有你才能打开的加密文档/消息时使用 PKC 希望向其他人发送加密文档/消息并证明它确实由你发送时使用 PKC 使用 PKC 和加密哈希对文档/消息进行数字签名 交易哈希链使用数字签名转让数字资产所有权;每个交易记录

    2024年03月12日
    浏览(47)
  • 【Qt】QCryptographicHash生成加密哈希值

    QCryptographicHash 类提供了一种生成加密哈希值的方法,可对二进制或文本数据进行加密。 先看两个最常用的静态函数 例如,对密码使用MD5加密: 加密类型 值 描述 QCryptographicHash::Md4 0 生成 MD4 哈希值 QCryptographicHash::Md5 1 生成 MD5 哈希值 QCryptographicHash::Sha1 2 生成 SHA-1 哈希值 QC

    2024年02月11日
    浏览(24)
  • java和js实现前端加密后端解密,后端加密前端解密(Base64)

    目录 1.前端加密后端解密 2.后端加密前端解密 在前端和后端数据传输时,常常涉及到隐私数据的传输(例如用户名和密码),这时,我们就需要对隐私数据进行加密解密 1.前端加密后端解密         1.1 前端jquery实现         1.2后端 2.后端加密前端解密         2.1后端加密

    2024年02月16日
    浏览(56)
  • php对称加密AES加密解密

    AES-128-ECB和AES-256-CBC是两种常见的AES加密模式,它们在加密方式和安全性上有以下区别: 加密方式: AES-128-ECB:ECB(Electronic Codebook)模式是最简单的AES加密模式,它将数据分成固定大小的块,每个块独立加密。这意味着相同的明文块将始终加密为相同的密文块,因此ECB模式不

    2024年02月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包