刷题的日常-设计一个验证系统

117 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

刷题的日常-2023年2月9号

一天一题,保持脑子清爽

设计一个验证系统

来自leetcode的 1797 题,题意如下:

你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 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 操作),过期事件 优先于 其他操作。

理解题意

通过题意,我们可以将信息整理如下:

  • 设计题,要我们设计数据结构
  • 固定一个token生存时间
  • 然后有三个方法
  • 一个是生成token,在生存时间内都有效
  • 一个是刷新生存时间,在刷新的时间之后token都有效
  • 最后是一个统计方法,给定一个时间,返回当前时间之后还有效的token个数

注意

  • 每次调用时间都是往前加的,不会后退

做题思路

因为时间不会后退,所以就不需要记录所有的日志,只需要更新最后的时间即可。步骤如下:

  • 用Map记录出现的token,还需要有个int值记录生存时间
  • 生成token的方法比较简单,直接往Map里放就行
  • 刷新token的方法需要判断下之前是否出现过,如果有并且没有过期才进行刷新
  • count方法需要扫描Map,将最后刷新时间 加上 生存时间,如果大于查询时间就算有效,将返回结果加一,最后返回结果即可

代码实现

代码实现如下:

image.png

image.png