2 solutions
-
0
题目描述
你是一名网络工程师,正在开发一个虚拟机管理系统,需要管理虚拟机的资源ID。为了确保每个虚拟机的ID唯一且可复用,你设计了一个资源池,支持三种操作: 动态分配:从资源池中按顺序分配指定数量的资源ID,适用于新创建的虚拟机。 指定分配:指定一个资源ID进行分配,适用于恢复或迁移的虚拟机。 释放资源:释放已经分配的资源ID,使其可再次使用。 每当资源ID被分配或释放时,资源池的管理会调整顺序,使得资源ID能够合理复用。你需要在执行操作后输出资源池的第一个空闲资源ID。
思路
数组模拟双向链表
思路步骤
1.初始化资源池: 给定资源池的范围 [l, r],我们需要用两个数组分别表示每个资源ID的左邻居和右邻居,同时还需要一个数组表示某个资源ID是否被占用。
2.动态分配资源ID: 根据要求,动态分配会从资源池的开始位置,按顺序分配指定数量的ID。每次分配一个ID后,我们将其从可用资源链表中移除,并更新链表的头部指针。
3.指定分配资源ID: 如果指定分配的ID在资源池范围内且未被占用,则将其从可用链表中移除。如果该ID正好是资源池的头或尾,还需要特别处理。
4.释放资源ID: 释放的资源ID需要重新加入到资源池的尾部,同时恢复它与前后节点的连接。
5.操作执行后: 每次操作结束后,输出资源池中第一个空闲的资源ID。
引入链表后,带来新的问题:对于后两个操作,我们也需要同时删除/插入一个节点。单纯用链表是无法快速做到这一点的。
解决方法:直接使用数组来模拟链表,具体实现见代码。
注意:华为OJ只给了100ms。这意味着你需要在极低的常数下通过这题。所以只有C/C++可能过这题。而且不仅需要使用C/C++,也不允许使用STL中的List,而是需要手写链表 。 这直接导致了本场成为华为春招最难的一场,通过率极低,估计只有10%。
代码说明
1.初始化链表:创建两个数组 L 和 R,分别表示每个资源ID的左邻居和右邻居;另一个数组 ud 用于标记每个资源ID是否被使用。
2.动态分配:
检查是否有足够的可用资源; 按顺序从链表中取出 num 个资源ID; 移除这些ID,并更新链表的头部。
3.指定分配:
检查指定的资源ID是否在范围内且未被占用; 将其从链表中移除,更新其前后连接。
4.释放资源ID:
检查释放的资源ID是否在范围内且已经被占用; 将其加入链表的尾部,更新链表的连接关系。
5.输出结果:
输出当前链表的第一个空闲资源ID,即当前的链表头部。
代码
C++
AC
python
超时
Java
超时
Go
能够AC,出自233大佬之手!
Js
超时...
- 1
Information
- ID
- 14
- Time
- 100ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 81
- Accepted
- 7
- Uploaded By