FizzBuzz, если число делится на 3 и 5, Fizz, если делится только на 3, Buzz, если делится только на 5, иначе само число.
FizzBuzz, если число делится на 3 и 5, Fizz, если делится только на 3, Buzz, если делится только на 5, иначе само число.
Условие задачи
Для чисел от 1 до n:
если число делится и на 3, и на 5 — вывести FizzBuzz;
если число делится только на 3 — вывести Fizz;
если число делится только на 5 — вывести Buzz;
иначе вывести само число.
Решение
def fizz_buzz(n: int) -> list[str]:
result = []
for number in range(1, n + 1):
if number % 15 == 0:
result.append('FizzBuzz')
elif number % 3 == 0:
result.append('Fizz')
elif number % 5 == 0:
result.append('Buzz')
else:
result.append(str(number))
return resultПример использования
print(fizz_buzz(15))
# ['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz']Почему FizzBuzz проверяют первым
Проверку делимости на 3 и 5 нужно выполнять до отдельных проверок на 3 и 5. Иначе число 15 попадёт в ветку number % 3 == 0 и функция вернёт Fizz вместо FizzBuzz.
Альтернативный вариант
def fizz_buzz(n: int) -> list[str]:
result = []
for number in range(1, n + 1):
value = ''
if number % 3 == 0:
value += 'Fizz'
if number % 5 == 0:
value += 'Buzz'
result.append(value or str(number))
return resultСложность
Алгоритм делает один проход от 1 до n, поэтому временная сложность равна O(n). Если сохранять все результаты в список, дополнительная память также равна O(n); если сразу печатать значения, дополнительная память будет O(1).
Как ответить на собеседовании
Я прохожу числа от 1 до n и сначала проверяю делимость на 15, затем на 3 и 5. Проверка на 15 должна идти первой, чтобы для числа 15 вернулся FizzBuzz. Решение выполняется за O(n).
Оцени свой прогресс