We need to implement a data structure named
DataStream. There are two methods required to be implemented:void add(number)// add a new numberint firstUnique()// return first unique number
Example
Example 1:
Input:
add(1)
add(2)
firstUnique()
add(1)
firstUnique()
Output:
[1,2]
Example 2:
Input:
add(1)
add(2)
add(3)
add(4)
add(5)
firstUnique()
add(1)
firstUnique()
add(2)
firstUnique()
add(3)
firstUnique()
add(4)
firstUnique()
add(5)
add(6)
firstUnique()
Output:
[1,2,3,4,5,6]
Notice
You can assume that there must be at least one unique number in the stream when calling the firstUnique.
Similar to the "LRU cache" problem. Build a hashMap + doubly linked list. The list is ordered by the sequence of adding the numbers.
Code (Java):
public class DataStream {
Map<Integer, ListNode> numToNodeMap;
LinkedList nodeList;
public DataStream(){
// do intialization if necessary
numToNodeMap = new HashMap<>();
nodeList = new LinkedList();
}
/**
* @param num: next number in stream
* @return: nothing
*/
public void add(int num) {
// write your code here
if (!numToNodeMap.containsKey(num)) {
ListNode node = nodeList.appendToTail(num);
numToNodeMap.put(num, node);
} else {
ListNode node = numToNodeMap.get(num);
nodeList.remove(node);
numToNodeMap.put(num, null);
}
}
/**
* @return: the first unique number in stream
*/
public int firstUnique() {
// write your code here
return nodeList.getFirst().val;
}
}
class ListNode {
int val;
ListNode prev, next;
public ListNode(int val) {
this.val = val;
prev = next = null;
}
}
class LinkedList {
ListNode dummyHead;
ListNode dummyTail;
public LinkedList() {
dummyHead = new ListNode(-1);
dummyTail = new ListNode(-1);
dummyHead.next = dummyTail;
dummyTail.prev = dummyHead;
}
ListNode appendToTail(int val) {
ListNode tailNode = new ListNode(val);
dummyTail.prev.next = tailNode;
tailNode.prev = dummyTail.prev;
tailNode.next = dummyTail;
dummyTail.prev = tailNode;
return tailNode;
}
ListNode getFirst() {
if (dummyHead.next == dummyTail) {
return null;
}
return dummyHead.next;
}
void remove(ListNode node) {
if (node == null) {
return;
}
ListNode prevNode = node.prev;
ListNode nextNode = node.next;
prevNode.next = nextNode;
nextNode.prev = prevNode;
node.prev = null;
node.next = null;
}
}
No comments:
Post a Comment