LeetCode 1797. 设计一个验证系统(map)
文章目录
- 1. 题目
- 2. 解题
1. 题目
你需要设计一个包含验证码的验证系统。
每一次验证中,用户会收到一个新的验证码,这个验证码在 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 <= timeToLive <= 108
1 <= currentTime <= 108
1 <= tokenId.length <= 5
tokenId 只包含小写英文字母。
所有 generate 函数的调用都会包含独一无二的 tokenId 值。
所有函数调用中,currentTime 的值 严格递增 。
所有函数的调用次数总共不超过 2000 次。
https://leetcode-cn.com/problems/design-authentication-manager/
2. 解题
- 使用 双向 map 记录 token 和 time,题目说了都是独一无二的 key
class AuthenticationManager {int livetime;map<int,string> t_str;unordered_map<string, int> str_t;
public:AuthenticationManager(int timeToLive) {livetime = timeToLive;}void generate(string tokenId, int currentTime) {t_str[currentTime] = tokenId;str_t[tokenId] = currentTime;}void renew(string tokenId, int currentTime) {if(!str_t.count(tokenId)) return;int t = str_t[tokenId];if(currentTime-t < livetime) {t_str.erase(t);t_str[currentTime] = tokenId;str_t[tokenId] = currentTime;}}int countUnexpiredTokens(int currentTime) {for(auto it = t_str.begin(); it != t_str.end(); ) {int t = it->first;string token = it->second;if(currentTime-t >= livetime){ // 删除过期的t_str.erase(it++);str_t.erase(token);}else // map key 有序,没过期,停止删除break;}return str_t.size();}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1797. 设计一个验证系统(map)相关推荐
- Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- 面试官:如何设计一个 订单系统?
大家好,我是田哥,昨天有个朋友去面试,被问到订单系统如何设计,主要是因为他简历上有个电商相关的项目.幸好这位兄弟一开始有所准备,不然这场面试估计就凉了. <Java 面试辅导>来啦!田哥和 ...
- 阿里最后一面,高并发下如何设计一个秒杀系统?
近年来,随着"双十一"购物节和抖音等直播平台带货的热潮,大批促销活动涌现,「秒杀」这个词也越来越频繁地出现在我们的生活里. 除了那些头部的电商公司,某宝.某东,还有各种街.某说.某 ...
- 如何设计一个权限系统
本文来说下如何设计一个权限系统 文章目录 概述 权限模型 RBAC0模型 RBAC1模型 RBAC2模型 RBAC3模型 用户组 组织 职位 含有组织/职位/用户组的模型 授权流程 表结构 权限框架 ...
- 大厂最后一面,如何设计一个秒杀系统
近年来,随着"双十一"购物节和抖音等直播平台带货的热潮,大批促销活动涌现,「秒杀」这个词也越来越频繁地出现在我们的生活里. 除了那些头部的电商公司,某宝.某东,还有各种街.某说.某 ...
- 极客时间-如何设计一个秒杀系统-笔记0到2章
极客时间-如何设计一个秒杀系统-笔记0到2章 0.开篇词-系统秒杀系统架构设计都有哪些关键点? 1.设计秒杀系统时应该注意的5个架构原则 1.数据要尽量少 2.请求数要尽量少 3.路径要尽量少 4.依 ...
- 设计一个秒杀系统-秒杀方案分析
学习使用,老鸟飞过,欢迎交流 秒杀系统应该考虑哪些因素 高可用:秒杀系统最大的特点就是并发高,在极短的时间内, 瞬间用户量大.试想一下双11的时候可能会有几十万的用户去访问同一个商品详情页面秒杀同一个 ...
- Java数据结构与算法-----如何设计一个排队系统
1.问题 设计一个排队系统,能够让每个进入队的用户都能看到自己在队列中所处的位置和变化.队列可能随时有人加入和退出,当有人退出时影响到用户的位置需要及时的反馈到用户. 2.问题分析: 不仅要实现队列常 ...
- 用c语言设计一个年历系统流程图,用C语言编写一个年历.docx
黑龙江八一农垦大学理学院 <C 程序设计>课程设计报告 2011-2012 学年第二学期 设计题目: 指导教师: 用 C 语言设计一个年历系统 魏老师 完成时间:2012 年 6 月 13 ...
最新文章
- Python进阶【第五篇】函数式编程及某些特殊函数
- linux更新驱动脚本,编写Linux驱动常见错误(不断更新)!
- VTK:Shaders之BozoShaderDemo
- 修改FTP密码的三种方法
- Github项目推荐|可视化 GAN 的训练过程
- python watchdog的使用_python watchdog监控文件修改
- 用Python爬数据,FineBI做分析后,我发现淘宝的手机原来这么便宜
- BAT程序员必备技能调研,你中了几招?
- MYSQL C API风格demo
- LocalDateTime时间加减法
- 20190324每日一句:生活中的困难使我更加强大​​​​​​​
- 汉字转拼音(支持多音字)
- 杭州登山地图是谁开发的_浙江新添7个省级运动休闲小镇!杭州这个地方榜上有名!...
- maya python vrayies set ies file
- VMware Workstation Player的vmnet8没启动,虚拟机没法NAT的问题分析与解决
- Matlab突然闪退 出现Fatal Error On Startup解决办法
- 使 div 水平 垂直 居中
- stm32语音识别文字显示_『免费开源』基于STM32的之语音识别
- 如何用Java微信扫码实现签到_详解JAVA后端实现统一扫码支付:微信篇
- 俄罗斯、乌克兰程序员薪资曝光!年薪 15w+,女程序员比男程序员收入高