zoukankan      html  css  js  c++  java
  • Leetcode: Design Phone Directory

    Design a Phone Directory which supports the following operations:
    
    get: Provide a number which is not assigned to anyone.
    check: Check if a number is available or not.
    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);

    my HashSet+ ArrayList, 删除的时候把要删的index与末尾对调。get()其实不需要random, 因为anyone is ok

     1 public class PhoneDirectory {
     2     ArrayList<Integer> arr;
     3     HashSet<Integer> set;
     4 
     5     /** Initialize your data structure here
     6         @param maxNumbers - The maximum numbers that can be stored in the phone directory. */
     7     public PhoneDirectory(int maxNumbers) {
     8         arr = new ArrayList<Integer>();
     9         set = new HashSet<Integer>();
    10         for (int i=0; i<maxNumbers; i++) {
    11             arr.add(i);
    12             set.add(i);
    13         }
    14     }
    15     
    16     /** Provide a number which is not assigned to anyone.
    17         @return - Return an available number. Return -1 if none is available. */
    18     public int get() {
    19         if (arr.size() == 0) return -1;
    20         Random random = new Random();
    21         int index = random.nextInt(arr.size());
    22         int temp = arr.get(index);
    23         arr.set(index, arr.get(arr.size()-1));
    24         arr.set(arr.size()-1, temp);
    25         arr.remove(arr.size()-1);
    26         set.remove(temp);
    27         return temp;
    28     }
    29     
    30     /** Check if a number is available or not. */
    31     public boolean check(int number) {
    32         return set.contains(number);
    33     }
    34     
    35     /** Recycle or release a number. */
    36     public void release(int number) {
    37         if (!set.contains(number)) {
    38             arr.add(number);
    39             set.add(number);
    40         }
    41     }
    42 }
    43 
    44 /**
    45  * Your PhoneDirectory object will be instantiated and called as such:
    46  * PhoneDirectory obj = new PhoneDirectory(maxNumbers);
    47  * int param_1 = obj.get();
    48  * boolean param_2 = obj.check(number);
    49  * obj.release(number);
    50  */

    HashSet+ Queue网上vote最高的solution, 

     1 public class PhoneDirectory {
     2 
     3     Set<Integer> used = new HashSet<Integer>();
     4     Queue<Integer> available = new LinkedList<Integer>();
     5     int max;
     6     public PhoneDirectory(int maxNumbers) {
     7         max = maxNumbers;
     8         for (int i = 0; i < maxNumbers; i++) {
     9             available.offer(i);
    10         }
    11     }
    12     
    13     public int get() {
    14         Integer ret = available.poll();
    15         if (ret == null) {
    16             return -1;
    17         }
    18         used.add(ret);
    19         return ret;
    20     }
    21     
    22     public boolean check(int number) {
    23         if (number >= max || number < 0) {
    24             return false;
    25         }
    26         return !used.contains(number);
    27     }
    28     
    29     public void release(int number) {
    30         if (used.remove(number)) {
    31             available.offer(number);
    32         }
    33     }
    34 }
    35 
    36 /**
    37  * Your PhoneDirectory object will be instantiated and called as such:
    38  * PhoneDirectory obj = new PhoneDirectory(maxNumbers);
    39  * int param_1 = obj.get();
    40  * boolean param_2 = obj.check(number);
    41  * obj.release(number);
    42  */
  • 相关阅读:
    JVM原理---------------1.开篇
    mysql开启事务的方式,命令学习
    mysql中的锁
    mysql索引底层原理
    mysql的常见存储引擎与常见日志类型,以及4种线程的作用
    Mutex
    委托和匿名委托
    线程通信
    同步锁
    [ValidateInput(false)]
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6194348.html
Copyright © 2011-2022 走看看