海外网站入口,wordpress默认摘要,房地产新闻时事热点,机械加工网报价文章目录1. 题目2. 解题1. 题目
你需要设计一个包含验证码的验证系统。 每一次验证中#xff0c;用户会收到一个新的验证码#xff0c;这个验证码在 currentTime 时刻之后 timeToLive 秒过期。 如果验证码被更新了#xff0c;那么它会在 currentTime #xff08;可能与之前…
文章目录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;mapint,string t_str;unordered_mapstring, 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阿明一起加油、一起学习进步