int getNextDay(int days_mask, int today) {
if (!days_mask) return -1; // no days set
days_mask |= days_mask << 7; // duplicate days into next week
mask = 1 << (today % 7); // keep track of the day
while (!(mask & days_mask)) {
mask <<= 1;
++today;
}
return today % 7;
}
Так что это только один, если в начале и в то время как цикл. Как это?
Редактировать: Я только что понял, что был вырожденный случай, когда, если использование проходит сегодня> = 14 (или больше, чем самый высокий установленный бит), цикл while становится бесконечным. (Сегодня% 7) в строке 4 исправляет этот случай.
И если я могу (без энтузиазма) ворчать о том, что другая версия получает галочку, моя версия имеет только 2 вызова модуля, в то время как проверенное решение будет иметь минимум 1 и максимум 6 вызовов модуля.
Также интересен комментарий о том, возвращает ли функция «сегодня», если установлено сегодня. Если функция не должна возвращаться сегодня, если только сегодня не будет единственный день в наборе, вам потребуется предварительно увеличить сегодня на строку 3 моего решения.