Сложность: medium
У вас есть очередь целых чисел, необходимо извлечь первый уникальный элемент из очереди.
Реализуйте класс FirstUnique:
- FirstUnique(int[] nums) Инициализирует объект числами в очереди.
- int showFirstUnique() возвращает значение первого уникального элемента в очереди и возвращает -1, если такого элемента нет.
- void add(int value) вставляет значение в очередь.
Пример:
Input:
["FirstUnique","showFirstUnique","add","showFirstUnique","add","showFirstUnique","add","showFirstUnique"]
[[[2,3,5]],[],[5],[],[2],[],[3],[]]
Output:
[null,2,null,2,null,3,null,-1]
Explanation:
FirstUnique firstUnique = new FirstUnique([2,3,5]);
firstUnique.showFirstUnique(); // return 2
firstUnique.add(5); // the queue is now [2,3,5,5]
firstUnique.showFirstUnique(); // return 2
firstUnique.add(2); // the queue is now [2,3,5,5,2]
firstUnique.showFirstUnique(); // return 3
firstUnique.add(3); // the queue is now [2,3,5,5,2,3]
firstUnique.showFirstUnique(); // return -1
👨💻 Алгоритм:
1⃣Инициализируйте объект FirstUnique с числами в очереди, добавляя их в структуру данных для отслеживания уникальности и порядка.
2⃣Метод showFirstUnique возвращает значение первого уникального элемента в очереди, если таковой существует, или -1, если уникальных элементов нет.
3⃣Метод add добавляет новое значение в очередь. Если значение уже было добавлено ранее, обновляет его статус уникальности и удаляет его из множества уникальных значений, если оно больше не уникально.
😎 Решение:
public class FirstUnique {
private LinkedList<int> queue;
private Dictionary<int, LinkedListNode<int>> map;
private HashSet<int> duplicates;
public FirstUnique(int[] nums) {
queue = new LinkedList<int>();
map = new Dictionary<int, LinkedListNode<int>>();
duplicates = new HashSet<int>();
foreach (var num in nums) {
Add(num);
}
}
public int ShowFirstUnique() {
if (queue.Count > 0) {
return queue.First.Value;
}
return -1;
}
public void Add(int value) {
if (duplicates.Contains(value)) {
return;
}
if (map.ContainsKey(value)) {
queue.Remove(map[value]);
map.Remove(value);
duplicates.Add(value);
} else {
var node = new LinkedListNode<int>(value);
queue.AddLast(node);
map[value] = node;
}
}
}Ставь 👍 и забирай 📚 Базу знаний