博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Design Phone Directory 设计电话目录
阅读量:6905 次
发布时间:2019-06-27

本文共 2335 字,大约阅读时间需要 7 分钟。

 

Design a Phone Directory which supports the following operations:

 

  1. get: Provide a number which is not assigned to anyone.
  2. check: Check if a number is available or not.
  3. release: Recycle or release a number.

Example:

// Init a phone directory containing a total of 3 numbers: 0, 1, and 2.PhoneDirectory directory = new PhoneDirectory(3);// It can return any available phone number. Here we assume it returns 0.directory.get();// Assume it returns 1.directory.get();// The number 2 is available, so return true.directory.check(2);// It returns 2, the only number that is left.directory.get();// The number 2 is no longer available, so return false.directory.check(2);// Release number 2 back to the pool.directory.release(2);// Number 2 is available again, return true.directory.check(2);

 

又是一道设计题,让我们设计一个电话目录管理系统,可以分配电话号码,查询某一个号码是否已经被使用,释放一个号码,需要注意的是,之前释放的号码下一次应该被优先分配。这题对C++解法的时间要求非常苛刻,尝试了好几种用set,或者stack/queue,或者使用vector的push_back等等,都TLE了,终于找到了一种可以通过OJ的解法。这里用两个一维数组recycle和flag,分别来保存被回收的号码和某个号码的使用状态,还有变量max_num表示最大数字,next表示下一个可以分配的数字,idx表示recycle数组中可以被重新分配的数字的位置,然后在get函数中,没法分配的情况是,当next等于max_num并且index小于等于0,此时返回-1。否则我们先看recycle里有没有数字,有的话先分配recycle里的数字,没有的话再分配next。记得更新相对应的flag中的使用状态,参见代码如下:

 

class PhoneDirectory {public:    /** Initialize your data structure here        @param maxNumbers - The maximum numbers that can be stored in the phone directory. */    PhoneDirectory(int maxNumbers) {        max_num = maxNumbers;        next = idx = 0;        recycle.resize(max_num);        flag.resize(max_num, 1);    }        /** Provide a number which is not assigned to anyone.        @return - Return an available number. Return -1 if none is available. */    int get() {        if (next == max_num && idx <= 0) return -1;        if (idx > 0) {            int t = recycle[--idx];            flag[t] = 0;            return t;        }        flag[next] = false;        return next++;    }        /** Check if a number is available or not. */    bool check(int number) {        return number >= 0 && number < max_num && flag[number];    }        /** Recycle or release a number. */    void release(int number) {        if (number >= 0 && number < max_num && !flag[number]) {            recycle[idx++] = number;            flag[number] = 1;        }    }private:    int max_num, next, idx;    vector
recycle, flag;};

 

参考资料:

 

转载地址:http://zsgdl.baihongyu.com/

你可能感兴趣的文章
《UNIX网络编程 卷2:进程间通信(第2版)》——2.3 创建与打开IPC通道
查看>>
商务直播跨海云:商务直播的那点事
查看>>
《MATLAB智能算法超级学习手册》一一第1章 MATLAB基础知识
查看>>
《Docker进阶与实战》——2.4节SparkContext概述
查看>>
《算法基础:打开算法之门》一导读
查看>>
《开源思索集》一成功的开源软件都有什么样的特点
查看>>
《Cisco IOS XR技术精要》一1.2 运营商级NOS需求
查看>>
Mozilla 拟在浏览器中增基于网页的虚拟现实功能
查看>>
《部署IPv6网络(修订版)》一2.3 IPv6 Internet控制消息协议(ICMPv6)
查看>>
《趣学CCNA——路由与交换》——6.1节Cisco设备的管理与配置
查看>>
Android 被曝多处安全漏洞 影响所有版本
查看>>
《数据结构与算法 C语言版》—— 3.2栈的应用举例
查看>>
在Linux上的虚拟机上启动Oracle上报ORA-00845: MEMORY_TARGET not supported on this system的问题解决...
查看>>
《Cisco IOS XR技术精要》一4.3 配置管理组件
查看>>
《社会智能与综合集成系统》—第2章参考文献
查看>>
《Adobe Photoshop CS5中文版经典教程(全彩版)》—第2课2.4节在Camera Raw中调整颜色...
查看>>
《Adobe Premiere Pro视频编辑指南(第2版)》——水银回放引擎
查看>>
从零开始打造个人专属命令行工具集——yargs 完全指南
查看>>
Spark源码分析 -- SchedulableBuilder
查看>>
《HTML5+CSS3网页设计入门必读》——第1章 理解Web的工作方式1.1 HTML和WWW简史
查看>>