首页 > 其他分享 >1797.设计一个验证系统

1797.设计一个验证系统

时间:2023-06-13 16:59:44浏览次数:50  
标签:aaa tokenId int currentTime 1797 验证码 renew 验证 设计

问题描述

1797. 设计一个验证系统 (Medium)

你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 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 <= 10⁸
  • 1 <= currentTime <= 10⁸
  • 1 <= tokenId.length <= 5
  • tokenId 只包含小写英文字母。
  • 所有 generate 函数的调用都会包含独一无二的 tokenId 值。
  • 所有函数调用中, currentTime 的值 严格递增
  • 所有函数的调用次数总共不超过 2000 次。

解题思路

利用哈希表存储所有未过期的token。

代码

class AuthenticationManager {
  public:
    AuthenticationManager(int timeToLive) {
        time_to_live = timeToLive;
    }

    void generate(string tokenId, int currentTime) {
        tokens[tokenId] = currentTime;
    }

    void renew(string tokenId, int currentTime) {
        if (tokens.find(tokenId) != tokens.end()) {
            if (currentTime - tokens[tokenId] < time_to_live) {
                tokens[tokenId] = currentTime;
            } else {
                tokens.erase(tokenId);
            }
        }
    }

    int countUnexpiredTokens(int currentTime) {
        int cnt = 0;
        for (auto iter = tokens.begin(); iter != tokens.end(); iter++) {
            if (currentTime - iter->second < time_to_live)
                cnt++;
        }
        return cnt;
    }

  private:
    int time_to_live;
    std::unordered_map<string, int> tokens;
};

标签:aaa,tokenId,int,currentTime,1797,验证码,renew,验证,设计
From: https://www.cnblogs.com/zwyyy456/p/17478093.html

相关文章

  • [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
    [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)——通过知识共享树立个人品牌。继上六篇:       [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)      [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不......
  • 案例1:路由交换无冗余线路设计1
    JR-SW1:undoterminalmonitorsystem-viewsysnameJR-SW1 user-interfacecon0 idle-timeout00 quit undoinfo-centerenable vlanbatch11to12100200 interfaceEthernet0/0/1 portlink-typeaccess portdefaultvlan11 interfaceEt......
  • Java课程设计-学生成绩管理系统
    Java课程设计.学生成绩管理系统一.描述*学生信息管理系统的功能,通过Java和web页面实现内部与界面的信息交互,web界面实现界面的各功能块的摆放。同时实现了登录功能,也可以进行增加学生信息,删减学生信息,以及查找学生信息等操作。同时我们也连接到数据库。1.功能框架图2.功能流......
  • Redis Key 设计规约
    RedisKey设计规约Redis的key命名规范1、建议全部大写,不强制2、key单词与单词之间以:分开3、key不能太长也不能太短,键名越长越占资源,太短可读性太差4、key的其他规则1、非常长的key是不推荐的。一个1024bytes是一个非常坏的注意,不仅仅是因为内存浪费,更是因为在数据......
  • Go学设计模式--原型模式的考查点和使用推荐
    这篇原创本周发布过一次,名字和内容有些问题,不利于长期留存,重新整理发布一次。如果一个类的有非常多的属性,层级还很深。每次构造起来,不管是直接构造还是用建造者模式,都要对太多属性进行复制,那么有没有一种好的方式让我们创建太的时候使用体验更好一点呢?今天的文章里就给大家介......
  • 下一代音视频SDK的方案设计
    经过五年的努力,腾讯云终端团队不断完善并积累出了一套完整的终端SDK方案体系,包含即时通信,主播推流,直播播放、点播播放、RTC实时互动、短视频录制,特效编辑等一系列音视频和实时通信相关的功能特性。在这些功能背后,团队是如何完成了框架设计、组件打磨、数据流转、性能优化的呢?本次Li......
  • 【技术积累】软件设计模式中的工厂模式【一】
    什么是工厂模式?工厂模式是一种设计模式,它利用工厂类来创建对象,而不是在程序中直接实例化对象。工厂模式可以隐藏创建对象的具体细节,提高代码可维护性和可扩展性。其核心思想是将对象的创建与具体实现分离开来,通过工厂类统一管理对象的创建,使得客户端无需了解创......
  • 面向对象设计原则-01
    概述面向对象设计的原则是为了提高软件的可维护性和可复用性。最好是在保持可维护性的同时,提高可复用性。单一职责原则单一职责原则(SingleResponsibilityPrinciple,SRP):一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。一个类承担的职责越多,越难以被复用......
  • 吉大 高级语言程序设计
    基础知识算法——程序设计精髓什么是算法?一个计算过程,具体指明应该进行的操作描述了解决问题的方法和途径是程序设计的基础和精髓有效算法的特点有穷性、确定性、有效性输入、输出组成基本操作表达式、变量赋值、读(输入)、写(输出)基本的控制结构顺序控制结构、......
  • R语言航班延误影响预测分析:lasso、决策树、朴素贝叶斯、QDA、LDA、缺失值处理、k折交
    全文链接:http://tecdat.cn/?p=32760原文出处:拓端数据部落公众号航班延误是航空公司、旅客和机场管理方面都面临的一个重要问题。航班延误不仅会给旅客带来不便,还会对航空公司和机场的运营产生负面影响。因此,对航班延误的影响因素进行预测分析,对于航空公司、旅客和机场管理方面都......