Как правильно учитывать последний отрезок при подсчёте результата?
Что проверяют
Замечаете ли вы классическую ошибку на хвосте: результат фиксируется в момент смены отрезка, а у последнего отрезка смены нет, и он теряется. Следом просят показать тест, который это ловит, или убрать дублирование кода после цикла.
Как отвечать
Сначала назовите, где это встречается: сжатие строки aaabcc в a3b1c2, самая длинная серия одинаковых элементов, разбиение по разделителю, суммы между отметками времени, нарезка на пачки фиксированного размера.
Приёмы:
- дозапись после цикла: после цикла ещё раз вызываете фиксацию, но только если отрезок не пустой. Логику фиксации выносят в метод, чтобы не копировать её;
- граница внутри цикла: цикл
for (int i = 1; i <= n; i++)и условиеif (i == n || a[i] != a[i-1]). Проверкаi == nстоит первой, поэтому до выхода за границу массива дело не доходит, а последний отрезок закрывается тем же кодом; - сентинел: в конец данных добавляют элемент, который заведомо отличается от остальных, например разделитель в конец строки. Хвост закрывается сам, но нужно гарантировать, что такое значение не встретится в данных;
- обновление на каждом шаге: если нужен максимум,
best = Math.max(best, len)пишут внутри цикла, а не при закрытии отрезка. Тогда хвост учитывается автоматически.
Для нарезки на пачки число отрезков считают целочисленно: (n+size-1)/size, а конец пачки берут как Math.min(start + size, n). Переход через Math.ceil и double здесь лишний.
Набор тестов: пустой вход, один элемент, все элементы одинаковые, самый длинный отрезок в самом конце. Именно последний случай ловит ошибку.
Где спотыкаются
Проверяют решение на примере, где самая длинная серия стоит в середине. Всё сходится, а на aabbb ответ получается 2 вместо 3.
Дописывают фиксацию после цикла без проверки на пустой вход. На пустом массиве появляется отрезок нулевой длины или обращение к a[0] бросает ArrayIndexOutOfBoundsException.
Разбивают строку через split(",") и теряют пустые поля в конце: "a,b,,".split(",") вернёт два элемента, а не четыре. Чтобы сохранить хвост, передают отрицательный лимит: split(",", -1).