Как найти максимальное число в массиве, которое встречается только один раз?
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
Нужно показать, что сначала считается частота всех элементов, а потом среди значений с частотой 1 выбирается максимальное. Важно сразу назвать асимптотику: обычно это делается за O(n) по времени и O(n) по памяти. Хорошо, если упомянуты крайние случаи: пустой массив и ситуация, когда уникальных элементов нет.
Определение:
Ищется наибольшее число в массиве, которое встречается ровно один раз. Практически это делается в два прохода: в первом строится карта частот, во втором выбирается максимальный элемент с частотой 1. Такой подход проще и надежнее, чем пытаться решать задачу на одном проходе без дополнительных структур.
Пример использования:
Например, для массива [5, 2, 9, 2, 7, 9, 3] частоты будут такие: 5→1, 2→2, 9→2, 7→1, 3→1. Уникальные элементы — 5, 7, 3, максимальный из них — 7.
package main
import "fmt"
func maxUnique(nums []int) (int, bool) {
freq := make(map[int]int)
for _, v := range nums {
freq[v]++
}
found := false
maxVal := 0
for v, c := range freq {
if c == 1 && (!found || v > maxVal) {
maxVal = v
found = true
}
}
return maxVal, found
}
func main() {
nums := []int{5, 2, 9, 2, 7, 9, 3}
if ans, ok := maxUnique(nums); ok {
fmt.Println(ans) // 7
} else {
fmt.Println("unique values not found")
}
}
Пояснение кода:
Сначала создается map[int]int, где ключ — число, значение — количество его вхождений. Затем массив обходится первый раз, и для каждого элемента увеличивается счетчик. После этого карта обходится второй раз: если частота равна 1, элемент сравнивается с текущим максимумом. Функция возвращает еще и bool, чтобы явно сообщить, найден ли хотя бы один уникальный элемент.
Ключевые моменты:
- Решение через частоты — самый простой и понятный способ.
- Время работы —
O(n), дополнительная память —O(n). - Если уникальных элементов нет, это нужно обработать отдельно.
- Для поиска максимума достаточно одного прохода по карте частот после подсчета.
- Если нужен только ответ, можно обойтись без сортировки: сортировка ухудшит сложность до
O(n log n). - В Go удобно использовать
map[int]intдля подсчета частот.