Инструменты

Задача №1: FizzBuzz

FizzBuzz, кажущаяся на первый взгляд игривой и простой задача программирования, стала неотъемлемой частью технических интервью. В этой статье мы рассмотрим не только ее формулировку и решение, но и погрузимся в тонкости, которые делают ее такой важной для оценки базовых навыков разработчика.

Вот в чем состоит задача FizzBuzz: написать программу, которая выводит числа от 1 до 100:

  • если число кратно 3, вывести Fizz;
  • если число кратно 5, вывести Buzz;
  • если число кратно 3 и 5, вывести FizzBuzz.

Ключом к решению этой задачи является использование оператора остатка от деления, который делит два значения и возвращает остаток. Если остаток равен 0, вы понимаете, что делимое (число, которое вы делили) кратно делителю (числу, на которое делили). Например, 6 % 3 делит 6 на 3 и возвращает остаток 0.

Python
print(6 % 3)
>> 0

Поскольку остатка нет, вы знаете, что 6 кратно 3.
Когда вы оцениваете 7 % 3, остаток есть, поэтому вы знаете, что 7 не кратно 3.

Python
print(7 % 3)
>> 1

Чтобы решить задачу FizzBuzz, вы перебираете числа от 1 до 100 и используете оператор по модулю, проверяя, является ли число кратным 3 и 5, только 3 или только 5.

Вот как это сделать:

Python
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] в качестве параметра.

Python
def fizzBuzz(n: int):

Создается пустой список result, который будет использоваться для хранения результата FizzBuzz.

Python
result = []

В начале используем цикл for для перебора каждого числа от [math]1[/math] до [math]n + 1[/math].

Python
for i in range(1, n + 1):

Затем используем условный оператор с оператором остатка от деления, чтобы определить, делится ли число i и на 3, и на 5. Если это условие выполняется, добавляется строка FizzBuzz в список result.

Python
if i % 3 == 0 and i % 5 == 0:
    result.append('FizzBuzz')

Далее вы используете еще один условный оператор, чтобы проверить, делится ли число на 3. Если это так, добавляется строка Fizz в список result.

Python
elif i % 3 == 0:
    result.append('Fizz')

Затем вы используете еще один условный оператор, чтобы проверить, делит- ся ли число на 5. Если это условие выполняется, добавляется строка Buzz в список result.

Python
elif i % 5 == 0:
    result.append('Buzz')

Если ни одно из предыдущих условий не выполняется, значит число не делится ни на 3, ни на 5. В этом случае добавляется строковое представление числа i в список result.

Python
else:
    result.append(str(i))

И в конце функция возвращает список result в качестве результата выполнения.

Python
return result

Когда вы запустите программу, вы увидите следующее:

  • числа, которые делятся на 3, например 6 и 27, заменяются на Fizz;
  • числа, кратные 5, например 10 и 85, заменяются на Buzz;
  • те числа, которые делятся на оба числа, например 15 и 30, заменяются на FizzBuzz.
Python
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 наименований и вы хотите что-то сделать с каждым вторым наименованием? Один из способов — перебирать каждый элемент и менять только элементы с четным индексом.

Пред.
Как удержать клиентов с помощью когортного анализа: простое руководство на Python для малого бизнеса

Как удержать клиентов с помощью когортного анализа: простое руководство на Python для малого бизнеса

Содержание Show Когортный анализ — это?

След.
Метод k ближайших соседей: k-NN

Метод k ближайших соседей: k-NN

Содержание Show Как работает k-NN?

Вам также может понравиться