Ответ вслух Middle Задачи на Java обновлено

Подводные камни Java в алгоритмических задачах

Вопрос

Какие особенности Java чаще всего ломают алгоритмические решения?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Первое это ввод-вывод: Scanner и println в цикле на 10⁵ строк съедают лимит, беру BufferedReader и StringBuilder. Второе переполнение: суммы, произведения, количество пар, расстояния в графах сразу в long, середину бинарного поиска считаю без переполнения.

Что должно прозвучать в ответе

  • Медленный Scanner и println в цикле

  • Переполнение int: суммы, произведения, количество пар

  • Сравнение Integer через == вне кеша

  • Компаратор через вычитание

  • Глубокая рекурсия и StackOverflowError

  • Упаковка в коллекциях и сортировка объектов вместо примитивов

Что могут спросить следом

  • Как развернуть рекурсивный DFS в итеративный?
  • Почему HashMap<Integer, Integer> может быть медленным?

Разбор

Первое это ввод-вывод: Scanner и println в цикле на 10⁵ строк съедают лимит, беру BufferedReader и StringBuilder. Второе переполнение: суммы, произведения, количество пар, расстояния в графах сразу в long, середину бинарного поиска считаю без переполнения. Третье сравнение обёрток: два Integer через == равны только в кеше до 127, на тестах с большими числами решение ломается, нужен equals или распаковка. Четвёртое компараторы через вычитание, вместо них Integer.compare. Пятое глубина рекурсии: DFS на миллион вершин переполнит стек, пишу итеративно. И шестое производительность упаковки: HashMap<Integer, Integer> и List<Integer> создают объекты, на больших объёмах выгоднее массивы примитивов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.