Given a continuous stream of numbers, write a function that returns the first unique number whenever terminating number is reached(include terminating number). If there no unique number before terminating number or you can't find this terminating number, return
-1
.Example
Example1
Input:
[1, 2, 2, 1, 3, 4, 4, 5, 6]
5
Output: 3
Example2
Input:
[1, 2, 2, 1, 3, 4, 4, 5, 6]
7
Output: -1
Solution:HashMap + Linked list
Code (Java):
public class Solution { /** * @param nums: a continuous stream of numbers * @param number: a number * @return: returns the first unique number */ public int firstUniqueNumber(int[] nums, int number) { // Write your code here if (nums == null || nums.length == 0) { return -1; } MyLinkedList canidateList = new MyLinkedList(); Map<Integer, ListNode> numToNodeMap = new HashMap<>(); for (int num : nums) { insert(num, canidateList, numToNodeMap); if (num == number) { if (canidateList.isEmpty()) { return -1; } else { return canidateList.getFirst().val; } } } return -1; } private void insert(int num, MyLinkedList list, Map<Integer, ListNode> map) { if (map.containsKey(num)) { // need to distiguish the 2nd time or 2+ times if (map.get(num) != null) { list.remove(map.get(num)); map.put(num, null); } } else { ListNode node = list.append(num); map.put(num, node); } } } class ListNode { ListNode next, prev; int val; public ListNode(int val) { this.val = val; next = prev = null; } } class MyLinkedList { private ListNode dummyHead; private ListNode dummyTail; public MyLinkedList() { dummyHead = new ListNode(-1); dummyTail = new ListNode(-1); dummyHead.next = dummyTail; dummyTail.prev = dummyHead; } public ListNode getFirst() { return dummyHead.next; } public boolean isEmpty() { return dummyHead.next == dummyTail; } public void remove(ListNode node) { ListNode prevNode = node.prev; ListNode nextNode = node.next; prevNode.next = nextNode; nextNode.prev = prevNode; } public ListNode append(int num) { ListNode currNode = new ListNode(num); ListNode prevNode = dummyTail.prev; prevNode.next = currNode; currNode.next = dummyTail; dummyTail.prev = currNode; currNode.prev = prevNode; return currNode; } }
No comments:
Post a Comment