设计一个电话目录,让它支持以下操作:
get
: 返回一个没有被分配过的电话号码,并将该电话号码设置为已分配。check
: 检查给定的电话号码是否未被分配。release
: 释放一个电话号码,该号码变成未分配。
示例:
// 初始化一个电话目录,包括 3 个电话号码:0,1 和 2 。 PhoneDirectory directory = new PhoneDirectory(3); // 可以返回任何未分配的电话号码。这里我们假设它返回 0 。 directory.get(); // 假设函数返回 1 。 directory.get(); // 号码 2 未分配,所以返回 true 。 directory.check(2); // 函数返回 2 ,分配后只剩下一个号码未被分配。 directory.get(); // 号码 2 已经被分配,所以返回 false 。 directory.check(2); // 释放号码 2 ,将该号码变回未分配。 directory.release(2); // 号码 2 现在是未分配,所以返回 true 。 directory.check(2);
思路:
坑点:题目里没提到get失败应该返回-1 这个条件……
用桶排序的思想解决。
class PhoneDirectory(object):
def __init__(self, maxNumbers):
"""
Initialize your data structure here
@param maxNumbers - The maximum numbers that can be stored in the phone directory.
:type maxNumbers: int
"""
self.list = [0 for _ in range(maxNumbers)]
def get(self):
"""
Provide a number which is not assigned to anyone.
@return - Return an available number. Return -1 if none is available.
:rtype: int
"""
for i, x in enumerate(self.list):
if x == 0:
self.list[i] = 1
return i
return -1
def check(self, number):
"""
Check if a number is available or not.
:type number: int
:rtype: bool
"""
return self.list[number] == 0
def release(self, number):
"""
Recycle or release a number.
:type number: int
:rtype: None
"""
self.list[number] = 0