Sobes.tech
Back to questions
Middle — Senior
13

Как найти максимальное число в массиве, которое встречается только один раз?

Companies where asked
AvitoAvito

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 для подсчета частот.