379. Design Phone Directory

来源:互联网 发布:matlab中的遗传算法 编辑:程序博客网 时间:2024/05/29 11:41

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);
最开始的想法,空间换时间,maxNumber个boolean数组分别记录这个数有没有被用过,true表示被用过,用hashset存储后来加进来的数字,这样做的逻辑很复杂。代码如下:

public class PhoneDirectory {    HashSet<Integer> hs = new HashSet<Integer>();    boolean[] used;    int index, size;    /** Initialize your data structure here        @param maxNumbers - The maximum numbers that can be stored in the phone directory. */    public PhoneDirectory(int maxNumbers) {        index = 0;        size = maxNumbers;        used = new boolean[maxNumbers];    }        /** Provide a number which is not assigned to anyone.        @return - Return an available number. Return -1 if none is available. */    public int get() {        if (index < size) {            if (hs.contains(index)) {                hs.remove(index);            }            used[index ++] = true;            return index - 1;        }        Integer res;        if (hs.isEmpty()) {            res = -1;        } else {            Iterator it = hs.iterator();            res = (Integer)it.next();            used[res] = true;            hs.remove(res);        }        return res;    }        /** Check if a number is available or not. */    public boolean check(int number) {        return !used[number];    }        /** Recycle or release a number. */    public void release(int number) {        used[number] = false;        hs.add(number);    }}/** * Your PhoneDirectory object will be instantiated and called as such: * PhoneDirectory obj = new PhoneDirectory(maxNumbers); * int param_1 = obj.get(); * boolean param_2 = obj.check(number); * obj.release(number); */
看top sulation有提到我上面的思想可以简化成一个数据结构BitSet。代码如下:

public class PhoneDirectory {    BitSet bits;    Integer firstFreeNumber;    Integer max;    /** Initialize your data structure here        @param maxNumbers - The maximum numbers that can be stored in the phone directory. */    public PhoneDirectory(int maxNumbers) {        bits = new BitSet(maxNumbers);        firstFreeNumber = 0;        max = maxNumbers;    }        /** Provide a number which is not assigned to anyone.        @return - Return an available number. Return -1 if none is available. */    public int get() {        if (firstFreeNumber >= max) {            return -1;        }        int num = firstFreeNumber;        bits.set(firstFreeNumber);        firstFreeNumber = bits.nextClearBit(firstFreeNumber);        return num;    }        /** Check if a number is available or not. */    public boolean check(int number) {        return bits.get(number) == false;    }        /** Recycle or release a number. */    public void release(int number) {        if (bits.get(number) == false) {            return;        }        bits.clear(number);        if (number < firstFreeNumber) {            firstFreeNumber = number;        }    }}/** * Your PhoneDirectory object will be instantiated and called as such: * PhoneDirectory obj = new PhoneDirectory(maxNumbers); * int param_1 = obj.get(); * boolean param_2 = obj.check(number); * obj.release(number); */

原创粉丝点击