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.
思路:数据只能访问一次,而且最后unique character还要有序,那么只有线性结构的data structure,要么数组,要么linkedlist,而且我们需要delete是O(1),那么就只能是linkedlist,我们又需要quickly access Node,那么就需要hashmap去存integer,node,那么我们存prenode比较合适,方便delete。
public class DataStream {
private class ListNode {
int val;
ListNode next;
public ListNode (int val) {
this.val = val;
next = null;
}
}
private HashMap<Integer, ListNode> numToPrev;
private ListNode dummpy;
private ListNode last;
private HashSet<Integer> duplicateSet;
public DataStream(){
// do intialization if necessary
numToPrev = new HashMap<Integer, ListNode>();
duplicateSet = new HashSet<Integer>();
dummpy = new ListNode(0);
last = dummpy;
}
/**
* @param num: next number in stream
* @return: nothing
*/
public void add(int num) {
if(duplicateSet.contains(num)){
return;
}
// first time meet num;
if(!numToPrev.containsKey(num)){
numToPrev.put(num, last);
ListNode node = new ListNode(num);
last.next = node;
last = node;
} else {
removeNumber(num);
duplicateSet.add(num);
}
}
private void removeNumber(int num) {
// if it contains, delete duplicate num;
ListNode prev = numToPrev.get(num);
//这里pre.next一定是!=null,因为就是num node;
prev.next = prev.next.next;
if(prev.next!=null) {
numToPrev.put(prev.next.val, prev);
} else {
// delete last node;
last = prev;
}
numToPrev.remove(num);
}
/**
* @return: the first unique number in stream
*/
public int firstUnique() {
return dummpy.next.val;
}
}