[LeetCode] Design Phone Directory 設計電話目錄 LeetCode All in One 題目講解彙總(持續更新中...)

 

Design a Phone Directory which supports the following operations:html

 

  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中的使用狀態,參見代碼以下:ide

 

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;
};

 

參考資料:函數

https://discuss.leetcode.com/topic/53136/all-c-solutions-got-lte/2post

 

LeetCode All in One 題目講解彙總(持續更新中...)url

相關文章
相關標籤/搜索