https://www.cnblogs.com/lz87/p/10111902.html
This problem was asked by Twitter.
You run an e-commerce website and want to record the last
N
order
ids in a log. Implement a data structure to accomplish this, with the following API:- record(order_id): adds the order_id to the log
- get_last(i): gets the ith last element from the log. i is guaranteed to be smaller than or equal to N.
You should be as efficient with time and space as possible.
Implementing a circular buffer suffices the requirement. It takes O(1) to record and get last ith.
1 public class LogDataStructure { 2 private int maxSize; 3 private int[] circularBuffer; 4 private int currIdx; 5 6 public LogDataStructure(int n) { 7 this.maxSize = n; 8 this.circularBuffer = new int[n]; 9 this.currIdx = 0; 10 } 11 12 public void record(int orderId) { 13 circularBuffer[currIdx] = orderId; 14 currIdx = (currIdx + 1) % maxSize; 15 } 16 17 public int getLast(int i) { 18 return circularBuffer[(currIdx - i + maxSize) % maxSize]; 19 } 20 }