电话目录管理系统
难度:
标签:
题目描述
代码结果
运行时间: 60 ms, 内存: 20.3 MB
/*
* 题目:电话目录管理系统
* 编号:379
*
* 题目思路:
* 1. 创建一个 PhoneDirectory 类来管理电话号码。
* 2. 使用一个 Set<Integer> 来跟踪可用的电话号码和一个 Set<Integer> 来跟踪已使用的电话号码。
* 3. 提供三个主要方法:get() 获取一个未使用的号码、check() 检查号码是否可用、release() 释放一个号码。
*/
import java.util.HashSet;
import java.util.Set;
import java.util.stream.IntStream;
public class PhoneDirectory {
private Set<Integer> available;
private Set<Integer> used;
public PhoneDirectory(int maxNumbers) {
available = IntStream.range(0, maxNumbers).collect(HashSet::new, Set::add, Set::addAll);
used = new HashSet<>();
}
public int get() {
if (available.isEmpty()) {
return -1; // 若无可用号码,返回 -1
}
int number = available.iterator().next();
available.remove(number);
used.add(number);
return number;
}
public boolean check(int number) {
return available.contains(number);
}
public void release(int number) {
if (used.contains(number)) {
used.remove(number);
available.add(number);
}
}
}
解释
方法:
该题解使用两个集合来管理电话号码的分配和释放。`availableNumbers` 集合存储所有当前可用的电话号码,而 `usedNumbers` 集合存储所有已经被分配的电话号码。通过这种方式,我们可以快速检查、分配和释放电话号码。初始化时,所有电话号码都被视为可用。当请求一个电话号码时,从 `availableNumbers` 中移除一个号码并加入到 `usedNumbers` 中。检查电话号码是否可用时,只需查看它是否还在 `availableNumbers` 中。释放电话号码时,从 `usedNumbers` 中移除并重新加入到 `availableNumbers` 中,使其再次可用。
时间复杂度:
O(1)
空间复杂度:
O(n) 其中 n 是电话目录能容纳的电话号码总数
代码细节讲解
🦆
在`PhoneDirectory`的实现中,为什么选择使用集合(set)来管理电话号码而不是其他数据结构如列表或队列?
▷🦆
如何处理`get`方法在集合为空时连续调用的情况,以及这种情况下的性能影响是什么?
▷🦆
在`release`方法中,如果尝试释放一个已经存在于集合中的号码,会发生什么?是否需要额外的逻辑来处理这种情况?
▷