Как использовать Map для поиска второй по длине последовательности нулей
Что проверяют
Задача алгоритмическая, но смотрят в первую очередь, уточняете ли вы условие до кода и понимаете ли, зачем здесь Map и нужна ли она вообще. Следом обычно просят решить за один проход без сортировки или вернуть не длину, а позицию серии.
Как отвечать
Сначала задайте вопросы по условию: что считать второй по длине, если две серии одинаковые (та же длина или следующая меньшая); что возвращать, если серий меньше двух; нужна длина или индекс начала. Интервьюер часто оставляет это открытым намеренно.
Каркас решения:
- сбор серий: один проход по массиву, счётчик
currentрастёт на нуле и сбрасывается на ненулевом элементе. Последнюю серию нужно дописать после цикла, иначе хвост из нулей потеряется; - роль Map:
TreeMap<Integer, Integer>, где ключ это длина серии, а значение число таких серий. Ключи уже упорядочены,lastKey()даёт максимум,lowerKey(max)следующую меньшую длину, а по значению видно, не встречается ли максимум дважды. Если нужна позиция, хранитеMap<Integer, Integer>от индекса начала к длине; - сложность: проход O(n), вставка в
TreeMapO(log k), где k число различных длин; - оптимальный вариант: две переменные
firstиsecond, обновляются при закрытии каждой серии. Один проход, O(1) памяти, коллекция не нужна.
Сильный ответ показывает оба решения: через Map, раз его просят, и честное замечание, что без неё проще и дешевле. Проговорите граничные случаи: пустой массив, массив без нулей, массив из одних нулей, несколько серий одной длины.
Где спотыкаются
Забывают закрыть последнюю серию после цикла, и массив, который заканчивается нулями, даёт неверный ответ.
Складывают длины в HashMap, потом копируют ключи в список и сортируют. Работает, но HashMap порядок не держит, и сортировка перечёркивает выбор структуры: TreeMap сразу решает задачу упорядочивания.
Молча выбирают трактовку «второй по длине». При двух сериях длины 3 один интервьюер ждёт ответ 3, другой следующую меньшую длину, и без уточнения верное решение выглядит ошибкой.