Считайте переходы через границу барабана, а не только попадания на значение 0; полные обороты тоже учитываются.
Модификация задачи про сейф: вместо финальной позиции посчитать, сколько раз стрелка прошла через ноль (пересечение границы 99→0 или 0→99).
Считайте переходы через границу барабана, а не только попадания на значение 0; полные обороты тоже учитываются.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Считайте переходы через границу барабана, а не только попадания на значение 0; полные обороты тоже учитываются.
Предполагаем барабан 0–99, начальную позицию 50 и целые безопасные Number во входе. BigInt предотвращает переполнение общего счётчика.
function countCrossings(turns) {
let position = 50n, count = 0n;
for (const turn of turns) {
if (!Number.isSafeInteger(turn)) throw new TypeError('Целый поворот');
const end = position + BigInt(turn);
const wraps = end >= 0n ? end / 100n : (end - 99n) / 100n;
count += wraps < 0n ? -wraps : wraps;
position = ((end % 100n) + 100n) % 100n;
}
return count;
}
Из 50 поворот -50 лишь достигает нуля и даёт 0 пересечений, -51 пересекает 0→99 один раз. Результат — BigInt; перед JSON его преобразуют в строку.