[LeetCode] Design Phone Directory 设计电话目录

简介:

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<int> recycle, flag;
};

本文转自博客园Grandyang的博客,原文链接:设计电话目录[LeetCode] Design Phone Directory ,如需转载请自行联系原博主。

相关文章
|
4天前
|
Go 容器 SQL
【Golang Leetcode】总目录(Day1~100)
【Golang Leetcode】总目录(Day1~100)
477 1
【Golang Leetcode】总目录(Day1~100)
|
存储 程序员
【Leetcode】20. 有效的括号、622. 设计循环队列
【Leetcode】20. 有效的括号、622. 设计循环队列
97 0
【Leetcode】20. 有效的括号、622. 设计循环队列
LeetCode 1381. 设计一个支持增量操作的栈
LeetCode 1381. 设计一个支持增量操作的栈
代码随想录刷题|LeetCode 203.移除链表元素 707.设计链表 206.反转链表
代码随想录刷题|LeetCode 203.移除链表元素 707.设计链表 206.反转链表
|
算法 Java
【LeetCode】初级算法案例+java代码(设计问题篇)
【LeetCode】初级算法案例+java代码(设计问题篇)
114 0
LeetCode每日一题——1678. 设计 Goal 解析器
请你设计一个可以解释字符串 command 的 Goal 解析器 。command 由 “G”、“()” 和/或 “(al)” 按某种顺序组成。
91 0
|
索引
LeetCode每日一题——707. 设计链表
设计链表的实现。您可以选择使用单链表或双链表。
82 0
|
存储
LeetCode每日一题——1206. 设计跳表
不使用任何库函数,设计一个 跳表 。
102 0
LeetCode每日一题——1206. 设计跳表
|
测试技术 API 索引
【day10】LeetCode(力扣)刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]
刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]。
107 0
【day10】LeetCode(力扣)刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]