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);最开始的想法,空间换时间,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);
*/