Sobes.tech
Назад к вопросам
Senior
7

//Дан массив чисел, в котором все числа кроме одного имеют пару, //найти число, которое встречается только один раз // <= [1, 0, 3, -2, 9, 9, 1, -2, 0] // => 3 int find(int[] arr){ Map<Integer, Integer> freq = new HashMap<>(); for (int i : arr){ freq.merge(i, 1, Integer::sum); } return freq.entrySet().stream() .filter(e -> e.getValue() == 1) .findFirst().get().getKey() .orElseThrow( () -> new NoSuchElementException("no unique elements") ); }

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

В представленном коде реализован поиск уникального числа в массиве, где все числа, кроме одного, встречаются по паре.

Идея решения:

  • Использовать Map<Integer, Integer> для подсчёта количества вхождений каждого числа.
  • Затем найти элемент с частотой 1.

Однако в коде есть ошибка: метод findFirst().get() возвращает объект Optional, и вызов orElseThrow после get() некорректен. Нужно сначала вызвать orElseThrow на Optional, а потом получить ключ.

Исправленный вариант:

int find(int[] arr) {
    Map<Integer, Integer> freq = new HashMap<>();
    for (int i : arr) {
        freq.merge(i, 1, Integer::sum);
    }
    return freq.entrySet().stream()
        .filter(e -> e.getValue() == 1)
        .map(Map.Entry::getKey)
        .findFirst()
        .orElseThrow(() -> new NoSuchElementException("no unique elements"));
}

Этот метод эффективно находит число, которое встречается один раз, за время O(n).