Implement Router
Question
Design a data structure that can efficiently manage data packets in a network router. Each data packet consists of the following attributes:
-
source: A unique identifier for the machine that generated the packet. -
destination: A unique identifier for the target machine. -
timestamp: The time at which the packet arrived at the router.
Implement the Router class:
Router(int memoryLimit): Initializes the Router object with a fixed memory limit.
-
memoryLimitis the maximum number of packets the router can store at any given time. -
If adding a new packet would exceed this limit, the oldest packet must be removed to free up space.
bool addPacket(int source, int destination, int timestamp): Adds a packet with the given attributes to the router.
-
A packet is considered a duplicate if another packet with the same
source,destination, andtimestampalready exists in the router. -
Return
trueif the packet is successfully added (i.e., it is not a duplicate); otherwise returnfalse.
int[] forwardPacket(): Forwards the next packet in FIFO (First In First Out) order.
-
Remove the packet from storage.
-
Return the packet as an array
[source, destination, timestamp]. -
If there are no packets to forward, return an empty array.
int getCount(int destination, int startTime, int endTime):
- Returns the number of packets currently stored in the router (i.e., not yet forwarded) that have the specified destination and have timestamps in the inclusive range
[startTime, endTime].
Note that queries for addPacket will be made in increasing order of timestamp.
Example 1
Input:
<br /> <span class="example-io">["Router", "addPacket", "addPacket", "addPacket", "addPacket", "addPacket", "forwardPacket", "addPacket", "getCount"]<br /> [[3], [1, 4, 90], [2, 5, 90], [1, 4, 90], [3, 5, 95], [4, 5, 105], [], [5, 2, 110], [5, 100, 110]]</span>Output:<br /> [null, true, true, false, true, true, [2, 5, 90], true, 1]
Example 2
Input:
<br /> <span class="example-io">["Router", "addPacket", "forwardPacket", "forwardPacket"]<br /> [[2], [7, 4, 90], [], []]</span>Output:<br /> [null, true, [7, 4, 90], []]
Constraints
2 <= memoryLimit <= 10^5
1 <= source, destination <= 2 * 10^5
1 <= timestamp <= 10^9
1 <= startTime <= endTime <= 10^9At most
10^5calls will be made toaddPacket,forwardPacket, andgetCountmethods altogether.queries for
addPacketwill be made in increasing order oftimestamp.
Hints
Hint 1
A deque can simulate the adding and forwarding of packets efficiently.
Hint 2
Use binary search for counting packets within a timestamp range.