Подводные камни Java в алгоритмических задачах
Вопрос
Какие особенности Java чаще всего ломают алгоритмические решения?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Медленный 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 ошибок.