FizzBuzz, кажущаяся на первый взгляд игривой и простой задача программирования, стала неотъемлемой частью технических интервью. В этой статье мы рассмотрим не только ее формулировку и решение, но и погрузимся в тонкости, которые делают ее такой важной для оценки базовых навыков разработчика.
Вот в чем состоит задача FizzBuzz: написать программу, которая выводит числа от 1 до 100:
- если число кратно 3, вывести Fizz;
- если число кратно 5, вывести Buzz;
- если число кратно 3 и 5, вывести FizzBuzz.
Ключом к решению этой задачи является использование оператора остатка от деления, который делит два значения и возвращает остаток. Если остаток равен 0, вы понимаете, что делимое (число, которое вы делили) кратно делителю (числу, на которое делили). Например, 6 % 3 делит 6 на 3 и возвращает остаток 0.
print(6 % 3)
>> 0
Поскольку остатка нет, вы знаете, что 6 кратно 3.
Когда вы оцениваете 7 % 3, остаток есть, поэтому вы знаете, что 7 не кратно 3.
print(7 % 3)
>> 1
Чтобы решить задачу FizzBuzz, вы перебираете числа от 1 до 100 и используете оператор по модулю, проверяя, является ли число кратным 3 и 5, только 3 или только 5.
Вот как это сделать:
def fizzBuzz(n: int):
result = []
for i in range(1, n + 1):
if i % 3 == 0 and i % 5 == 0:
result.append('FizzBuzz')
elif i % 3 == 0:
result.append('Fizz')
elif i % 5 == 0:
result.append('Buzz')
else:
result.append(str(i))
return result
Даже если вы хотите найти числа от 1 до 100, лучше всего ввести число [math]n[/math] вместо жесткого кодирования 100. Введение n сделает вашу программу более гибкой, если вы захотите запустить ее с другим числом. Итак, функция FizzBuzz принимает [math]n[/math] в качестве параметра.
def fizzBuzz(n: int):
Создается пустой список result
, который будет использоваться для хранения результата FizzBuzz.
result = []
В начале используем цикл for для перебора каждого числа от [math]1[/math] до [math]n + 1[/math].
for i in range(1, n + 1):
Затем используем условный оператор с оператором остатка от деления, чтобы определить, делится ли число i и на 3, и на 5. Если это условие выполняется, добавляется строка FizzBuzz в список result
.
if i % 3 == 0 and i % 5 == 0:
result.append('FizzBuzz')
Далее вы используете еще один условный оператор, чтобы проверить, делится ли число на 3. Если это так, добавляется строка Fizz в список result
.
elif i % 3 == 0:
result.append('Fizz')
Затем вы используете еще один условный оператор, чтобы проверить, делит- ся ли число на 5. Если это условие выполняется, добавляется строка Buzz в список result
.
elif i % 5 == 0:
result.append('Buzz')
Если ни одно из предыдущих условий не выполняется, значит число не делится ни на 3, ни на 5. В этом случае добавляется строковое представление числа i
в список result
.
else:
result.append(str(i))
И в конце функция возвращает список result
в качестве результата выполнения.
return result
Когда вы запустите программу, вы увидите следующее:
- числа, которые делятся на 3, например 6 и 27, заменяются на Fizz;
- числа, кратные 5, например 10 и 85, заменяются на Buzz;
- те числа, которые делятся на оба числа, например 15 и 30, заменяются на FizzBuzz.
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
Вашему алгоритму требуется [math]n[/math] шагов, поэтому он линейный и временная сложность (или асимптотическая сложность) алгоритма FizzBuzz, равна O(n). Если вы введете 100, алгоритму потребуется 100 шагов, если введете 1000, потребуется 1000 шагов.
Оператор остатка от деления был ключом к решению данной задачи. Однако он может быть полезен не только на техническом интервью. Оператор остатка от деления также используется при написании реальных приложений.
Например, у вас имеется текстовый файл длиной 50 000 строк, и вы можете на страницу поместить 49 строк. Сколько текста будет на последней странице? На последней странице будет 20 строк, потому что 50000 % 49 = 20. А что, если у вас база данных с 20 000 наименований и вы хотите что-то сделать с каждым вторым наименованием? Один из способов — перебирать каждый элемент и менять только элементы с четным индексом.