这个问题是在一家大型软件公司提出的。我想出了一个简单的解决方案,我想知道其他人对此解决方案的感受。
您应该为一个系统设计一个 API 和一个后端,该系统可以将电话号码分配给居住在城市中的人们。电话号码将从 111-111-1111 开始,到 999-999-9999 结束。API 应使客户(城市中的人)能够执行以下操作:
- 当客户请求电话号码时,它会为他们分配一个可用号码。
- 有些客户可能想要花哨的数字,所以他们可以专门要求分配给他们的数字。如果请求的号码可用,则系统将其分配给他们,否则系统分配任何可用的号码。
系统不必知道哪个号码分配给哪个客户。同一个客户端可能会发出连续的请求并为自己获得多个电话号码,但系统不会受到打扰。在任何时候,系统只知道分配了哪些电话号码,哪些电话号码是免费的。
从 111-111-1111 到 999-999-9999 的数字大致对应 80 亿个数字。假设内存不是约束,我可以想到以下两种方法(几乎相似)。
维护一个长度为 80 亿的巨大布尔数组,并有一个
next
指向数组索引的指针(next
初始化为零)。如果指向的值next
不是空闲的,则转发next
直到找到空闲的数字。当请求花哨的数字时,只需检查相应的索引位置是否空闲并返回数字即可。这种方法的缺点是,当以常规方式分配数字时,如果中间有一大块(比如 10 亿个)数字是通过花式分配分配的,那么next
指针必须移动 10 亿次。为了克服之前设计中提到的困难,我们可以使用某种链接的 hashmap。我们维护一个双向链表(这取代了之前设计中的数组)和另一个与列表长度相同的数组,其中数组的每个元素都指向列表中的相应元素。因此,在常规方法中分配数字时,我们在链表中推进一个指针,并将节点标记为分配时(与前面的方法相同)。在分配花式数字时,我们可以直接在列表中找到与请求的特殊数字相对应的节点,首先索引到数组中,然后跟随指针。一旦节点被识别,
让我知道我是否走在正确的轨道上。请告诉我我遗漏的任何重要细节。