Как найти первый плохой расчет по порогу времени в массиве расчетов
Что проверяют
Умеете ли вы уточнить условие задачи до того, как писать код, и видите ли, когда линейный проход можно заменить бинарным поиском. Следом обычно спрашивают: а если расчёты лежат в регистре на миллионы записей?
Как отвечать
Сначала задайте вопросы: что значит «плохой» (строго больше порога или больше либо равно), в каких единицах время, упорядочен ли массив и что вернуть, если плохих нет.
Базовое решение: линейный проход с выходом на первом совпадении, O(n) по времени и O(1) по памяти.
Функция ИндексПервогоПлохого(Расчеты, Порог)
Для Индекс = 0 По Расчеты.ВГраница() Цикл
Если Расчеты[Индекс].Длительность > Порог Тогда
Возврат Индекс;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункцииМассивы в 1С индексируются с нуля, у пустого массива ВГраница() возвращает -1, и цикл просто не выполнится. Значение для случая «плохих нет» оговорите заранее, чтобы вызывающий код его проверял.
Дальше покажите, что знаете ускорение:
- бинарный поиск: если после первого плохого расчёта все следующие тоже плохие (время монотонно растёт), задача сводится к поиску границы за O(log n). Держите
ЛевоиПраво, середину берите черезЦел((Лево + Право) / 2), при плохом значении сдвигайте правую границу на середину, иначе левую на середину плюс один; - запрос вместо цикла: если расчёты хранятся в базе, не выгружайте их в массив.
ВЫБРАТЬ ПЕРВЫЕ 1 ... ГДЕ Длительность > &Порог УПОРЯДОЧИТЬ ПО Периодотработает на стороне СУБД; - единицы времени: разность двух дат в 1С даёт секунды, а
ТекущаяУниверсальнаяДатаВМиллисекундах()миллисекунды. Порог и значения приводят к одному масштабу.
Где спотыкаются
Применяют бинарный поиск к неупорядоченным данным. Он вернёт какой-то плохой расчёт, но не обязательно первый, и это ломается на первом же контрпримере.
Не выходят из цикла после находки и продолжают перебор, перезаписывая индекс. В итоге возвращается последний плохой расчёт вместо первого.
Забывают граничные случаи: пустой массив, все расчёты хорошие, плохой стоит первым или последним. Проговорите их вслух как тесты, это ценят не меньше самого кода.