First Unique Number in Data Stream
public class Solution {
class ListNode {
int num;
ListNode prev, next; //定义为双向指针
ListNode(int num) {
this.num = num;
}
}
ListNode head, tail;
//每一个数字在LinkedList中指向的节点是哪一个
Map<Integer, ListNode> map;
//记录数字是否访问过
Set<Integer> seen;
public int firstUniqueNumber(int[] nums, int number) {
head = new ListNode(-1); //dummy
tail = head;
map = new HashMap<>();
seen = new HashSet<>();
for (int num : nums) {
addNumber(num);
if (num == number) { //在之前找答案
return getFirstUnique();
}
}
return -1;
}
private void addNumber(int num) {
//没出现过
if (!seen.contains(num)) {
seen.add(num);
//add new node to linkedList
ListNode node = new ListNode(num);
tail.next = node; //append 在 tail 后边
node.prev = tail;
tail = node;//tail 更新一下
//update map
map.put(num, node);
} else if (map.containsKey(num)) { //避免有第三个数出现,不能直接用else ??????
//出现过
//delete node from linkedList
ListNode node = map.get(num);
ListNode prev = node.prev;
ListNode next = node.next; //出现 .next 都需要判断corner case
prev.next = next;
//next节点有可能是null
if (next != null) {
next.prev = prev;
} else {
tail = prev;
}
//update map
map.remove(num); //不remove 会怎么样?
}
}
private int getFirstUnique() {
return head.next == null ? -1 : head.next.num;
}
}
最后更新于
这有帮助吗?