Leetcode.1797 设计一个验证系统

news2024/11/26 18:53:26

题目链接

Leetcode.1797 设计一个验证系统 Rating : 1534

题目描述

你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 currentTime时刻之后 timeToLive秒过期。如果验证码被更新了,那么它会在 currentTime(可能与之前的 currentTime不同)时刻延长 timeToLive秒。

请你实现 AuthenticationManager类:

  • AuthenticationManager(int timeToLive)构造 AuthenticationManager 并设置 timeToLive参数。
  • generate(string tokenId, int currentTime) 给定 tokenId,在当前时间 currentTime生成一个新的验证码。
  • renew(string tokenId, int currentTime) 将给定 tokenId未过期 的验证码在 currentTime时刻更新。如果给定 tokenId对应的验证码不存在或已过期,请你忽略该操作,不会有任何更新操作发生。
  • countUnexpiredTokens(int currentTime)请返回在给定 currentTime时刻,未过期 的验证码数目。

如果一个验证码在时刻 t过期,且另一个操作恰好在时刻 t发生(renew或者 countUnexpiredTokens操作),过期事件 优先于 其他操作。

示例 1:

在这里插入图片描述

输入:
[“AuthenticationManager”, “renew”, “generate”, “countUnexpiredTokens”, “generate”, “renew”, “renew”, “countUnexpiredTokens”]
[[5], [“aaa”, 1], [“aaa”, 2], [6], [“bbb”, 7], [“aaa”, 8], [“bbb”, 10], [15]]
输出:
[null, null, null, 1, null, null, null, 0]
解释:
AuthenticationManager authenticationManager = new AuthenticationManager(5); // 构造 AuthenticationManager ,设置 timeToLive = 5 秒。
authenticationManager.renew(“aaa”, 1); // 时刻 1 时,没有验证码的 tokenId 为 “aaa” ,没有验证码被更新。
authenticationManager.generate(“aaa”, 2); // 时刻 2 时,生成一个 tokenId 为 “aaa” 的新验证码。
authenticationManager.countUnexpiredTokens(6); // 时刻 6 时,只有 tokenId 为 “aaa” 的验证码未过期,所以返回 1 。
authenticationManager.generate(“bbb”, 7); // 时刻 7 时,生成一个 tokenId 为 “bbb” 的新验证码。
authenticationManager.renew(“aaa”, 8); // tokenId 为 “aaa” 的验证码在时刻 7 过期,且 8 >= 7 ,所以时刻 8 的renew 操作被忽略,没有验证码被更新。
authenticationManager.renew(“bbb”, 10); // tokenId 为 “bbb” 的验证码在时刻 10 没有过期,所以 renew 操作会执行,该 token 将在时刻 15 过期。
authenticationManager.countUnexpiredTokens(15); // tokenId 为 “bbb” 的验证码在时刻 15 过期,tokenId 为 “aaa” 的验证码在时刻 7 过期,所有验证码均已过期,所以返回 0 。

提示:

  • 1 < = t i m e T o L i v e < = 1 0 8 1 <= timeToLive <= 10^8 1<=timeToLive<=108
  • 1 < = c u r r e n t T i m e < = 1 0 8 1 <= currentTime <= 10^8 1<=currentTime<=108
  • 1 < = t o k e n I d . l e n g t h < = 5 1 <= tokenId.length <= 5 1<=tokenId.length<=5
  • tokenId只包含小写英文字母
  • 所有 generate函数的调用都会包含独一无二的 tokenId值。
  • 所有函数调用中,currentTime的值 严格递增
  • 所有函数的调用次数总共不超过 2000次。

分析:

用一个 哈希表 key代表验证码,value代表过期时间进行模拟即可。

时间复杂度: O ( 1 ) O(1) O(1)

代码:

class AuthenticationManager {
public:
    int timeToLive;
    unordered_map<string,int> m;

    AuthenticationManager(int timeToLive) {
        this->timeToLive  = timeToLive;
    }
    
    void generate(string tokenId, int currentTime) {
        m[tokenId] = currentTime + timeToLive;
    }
    
    void renew(string tokenId, int currentTime) {
        //先去掉已经过期的验证码
        for(auto it = m.begin();it != m.end();){
            if(it->second <= currentTime) m.erase(it++);
            else it++;
        }
        //再更新
        if(m.count(tokenId)) m[tokenId] = currentTime + timeToLive;
    }
    
    int countUnexpiredTokens(int currentTime) {
        int ans = 0;
        for(auto [k,v]:m){
            //记录未过期的验证码数量
            if(v > currentTime) ans++;
        }
        return ans;
    }
};

/**
 * Your AuthenticationManager object will be instantiated and called as such:
 * AuthenticationManager* obj = new AuthenticationManager(timeToLive);
 * obj->generate(tokenId,currentTime);
 * obj->renew(tokenId,currentTime);
 * int param_3 = obj->countUnexpiredTokens(currentTime);
 */

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

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

相关文章

完成各种项目生态环评工作丨全流程基于最新导则下的生态环境影响评价技术方法及图件制作与案例

目录 专题一 生态环境影响评价框架及流程 专题二 基于遥感解译的土地利用现状图的编制 专题三 生物多样性测定及R语言分析 专题四 植被类型及植被覆盖度图的编制 专题五 生物量与净初级生产力测定&#xff1a;实测及模型 专题六 生态系统类型及服务价值评估 专题七 物种…

【漫漫转码路】Day 45 机器学习 day04

梯度下降 梯度下降法是常用于求解无约束情况下凸函数的极小值&#xff0c;是一种迭代类型的算法&#xff0c;因为凸函数只有一个极值点&#xff0c;故求解出来的极小值点就是函数的最小值点 公式 第一个θ&#xff0c;是更新之后的θ&#xff0c;第二个θ是更新之前的θ&…

数据挖掘,计算机网络、操作系统刷题笔记47

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记47 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…

【LeetCode】1797. 设计一个验证系统

1797. 设计一个验证系统 题目描述 你需要设计一个包含验证码的验证系统。每一次验证中&#xff0c;用户会收到一个新的验证码&#xff0c;这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了&#xff0c;那么它会在 currentTime &#xff08;可能与之…

理解HDFS工作流程与机制,看这篇文章就够了

HDFS(The Hadoop Distributed File System) 是最初由Yahoo提出的分布式文件系统&#xff0c;它主要用来&#xff1a; 1&#xff09;存储大数据 2&#xff09;为应用提供大数据高速读取的能力 重点是掌握HDFS的文件读写流程&#xff0c;体会这种机制对整个分布式系统性能提升…

训练营day16

104.二叉树的最大深度 559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数104.二叉树的最大深度 力扣题目链接 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示…

javaEE 初阶 — UDP 协议

文章目录UDP 协议1. UDP协议报文结构1.1 一个 UDP 数据报能传输的最大数据1.2 校验和1.3 生成校验和的算法UDP 协议 1. UDP协议报文结构 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度&#xff0c;如果校验和出错&#xff0c;就会直…

计算机网络之http02| HTTPS HTTP1.1的优化

post与get请求的区别 get 是获取资源&#xff0c;Post是向指定URI提交资源&#xff0c;相关信息放在body里 2.http有哪些优点 &#xff08;1&#xff09;简单 报文只有报文首部和报文主体&#xff0c;易于理解 &#xff08;2&#xff09;灵活易拓展 URI相应码、首部字段都没有…

ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv3.4.10)

ORB-SLAM2编译、安装等问题汇总大全&#xff08;Ubuntu20.04、eigen3、pangolin0.5、opencv3.4.10&#xff09; 1&#xff1a;环境说明: 使用的Linux发行版本为Ubuntu 20.04 SLAM2下载地址为&#xff1a;git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 2&a…

Element UI框架学习篇(二)

Element UI框架学习篇(二) 1 整体布局 1.1 前提说明 el-container标签里面的标签默认是从左往右排列,若想要从上往下排列,只需要写el-header或者el-footer就行了 <el-container>&#xff1a;外层容器 <el-header>&#xff1a;顶栏容器。 <el-aside>&#…

Android框架源码分析——从设计模式角度看 Retrofit 核心源码

Android框架源码分析——从设计模式角度看 Retrofit 核心源码 Retrofit中用到了许多常见的设计模式&#xff1a;代理模式、外观模式、构建者模式等。我们将从这三种设计模式入手&#xff0c;分析 Retrofit2 的核心源码。 1. 宏观 Retrofit 是一个外观模式的设计 外观模式&am…

Intel处理器分页机制

分页模式 Intel 64位处理器支持3种分页模式&#xff1a; 32-bit分页PAE分页IA-32e分页 32-bit分页 32-bit分页模式支持两种页面大小&#xff1a;4KB以及4MB。 4KB页面的线性地址转换 4MB页面的线性地址转换 PAE分页模式 PAE分页模式支持两种页面大小&#xff1a;4KB以及…

Java 验证二叉搜索树

验证二叉搜索树中等给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下&#xff1a;节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1&…

ChatGPT注册流程攻略,含验证码接收(图文步骤)

本文给大家分享一下我成功注册的流程&#xff01; 其实方法都类似&#xff0c;若无海外手机号码可用接验证码的平台&#xff08;ps&#xff1a;我之前使用的是SMS-Activate&#xff09; 必要准备 能够科学上网&#xff08;并且全局模式&#xff09; 能确认登录的电子邮箱&…

ffmpeg硬解码与软解码的压测对比

文章目录ffmpeg硬解码与软解码的压测一、基本知识二、压测实验1. 实验条件及工具说明2. 压测脚本3. 实验数据结果ffmpeg硬解码与软解码的压测 一、基本知识 本文基于intel集显进行压测 软解码&#xff1a;cpu对视频进行解码硬解码&#xff1a;显卡或者多媒体处理芯片对视频进…

Python编程自动化办公案例(1)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.使用库讲解 1.xlrd 2.xlwt 二.主要案例 1.批量合并 模板如下&#xf…

Python 如何快速搭建环境?

Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 “python” 命令来查看本地是否已经安装Python以及Python的安装版本。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。) Win 9x/NT/2000 Macintosh (Intel, PPC, 68K) OS/2 DOS (多个…

67. Python的绝对路径

67. Python的绝对路径 文章目录67. Python的绝对路径1. 准备工作2. 路径3. 绝对路径3.1 概念3.2 查看绝对路径的方法4. 课堂练习5. 用绝对路径读取txt文件6. 加\改写绝对路径6.1 转义字符知识回顾6.2 转义字符改写7. 总结1. 准备工作 对照下图&#xff0c;新建文件夹和txt文件…

小知识点:MySQL 的 redo log、undo log、binlog 以及 Java 监控 binlog

SQL 入库流程 服务器与 MySQL 建立连接依次经过 MySQL 服务器内存中 Server 层的分析器、优化器、执行器执行器根据执行计划操作 InnoDB 引擎InnoDB 从磁盘数据文件中将 data 读到缓冲池中修改之前&#xff0c;会写入 undo log 将 data 存起来然后将缓冲池中的 data 改成 new_d…

数据结构复习(三)顺序表oj

目录 27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组 27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外…