Практикум по Python: задачи и их решения
Основные тестовые задачи по Python
Задача FizzBuzz
Каким образом реализовать классическую задачу FizzBuzz?
Эффективное решение с одним циклом и проверкой условий.
for i in range(1, 101):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)алгоритм решения задачи python (алгоритм решения задачи на python)
Порядок проверки важен: сначала деление на 15, затем на 3 и 5 по отдельности. Если поменять местами, результат будет неверным. Такой подход выполняется за O(n) и прост для понимания.
Как решить FizzBuzz с помощью конкатенации строк?
Вариант, при котором строка формируется на каждой итерации.
def fizzbuzz(n):
for i in range(1, n + 1):
out = ''
if i % 3 == 0:
out += 'Fizz'
if i % 5 == 0:
out += 'Buzz'
print(out or i)базовые задачи python (базовые задачи python)
Такой подход позволяет избежать вложенных условий. Если ни одно условие не сработало, печатается число.
Типичная ошибка – использование elif вместо второго if при формировании строки. В таком случае для чисел, кратных 15, напечатается только 'Fizz' или 'Buzz', но не 'FizzBuzz'.
Задача проверки палиндрома
Как проверить, является ли строка палиндромом?
Базовое решение – сравнение строки с её перевёрнутой копией.
def is_palindrome(s: str) -> bool:
s = s.lower().replace(' ', '')
return s == s[::-1]задачи для обучения python (задачи для обучения python)
Приведение к нижнему регистру и удаление пробелов позволяет обрабатывать фразы. Срезы [::-1] дают обратную строку. Такой метод корректен для любых строк, но копирует строку в памяти.
Как проверить палиндром без создания обратной строки?
Решение с двумя указателями, двигающимися от начала и конца.
def is_palindrome(s: str) -> bool:
s = s.lower().replace(' ', '')
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return Trueзадачи на классы в python (задачи на классы в python)
Этот вариант использует O(1) дополнительной памяти и останавливается при первом несовпадении.
Частая проблема – неучёт знаков препинания или регистра. Строки 'A man, a plan, a canal: Panama' требуют дополнительной очистки от всех небуквенных символов. Можно применить filter(str.isalnum, s).
Подсчёт частоты символов
Какими способами посчитать, сколько раз встречается каждый символ в строке?
Стандартное решение с использованием словаря и метода get.
def char_frequency(text: str) -> dict:
freq = {}
for ch in text:
freq[ch] = freq.get(ch, 0) + 1
return freqмножество python задачи (задачи на множества в python)
Метод get возвращает текущее значение или 0, если ключа нет. Такой код работает за O(n) и легко читается.
Как посчитать частоту символов с помощью collections.Counter?
Использование встроенного счётчика из модуля collections.
from collections import Counter
def char_frequency(text: str) -> Counter:
return Counter(text)задачи на модули python (задачи на модули в python)
Counter возвращает объект, похожий на словарь, с дополнительными методами, например most_common(3).
Проблема: если нужно учитывать только буквы, необходимо предварительно отфильтровать строку. Игнорирование регистра выполняется через text.lower().
Проверка анаграмм
Каким образом определить, являются ли две строки анаграммами?
Эффективное решение – сравнение отсортированных версий строк.
def is_anagram(s1: str, s2: str) -> bool:
s1 = s1.replace(' ', '').lower()
s2 = s2.replace(' ', '').lower()
return sorted(s1) == sorted(s2)задачи на операторы в python (задачи на операторы в python)
Сортировка преобразует строки в списки символов, упорядоченные одинаково, если строки содержат одинаковые символы. Сложность O(n log n).
Как проверить анаграммы без сортировки, используя частотный словарь?
Подсчёт количества каждого символа и сравнение словарей.
from collections import Counter
def is_anagram(s1: str, s2: str) -> bool:
s1 = s1.replace(' ', '').lower()
s2 = s2.replace(' ', '').lower()
return Counter(s1) == Counter(s2)
Этот вариант работает за O(n) и не изменяет исходные строки. Подходит для длинных строк.
Ошибка – сравнение строк без учёта пробелов, знаков препинания и регистра. Для точной проверки необходимо нормализовать обе строки одинаково. Также следует обработать случай разной длины: если строки разной длины, они не могут быть анаграммами.
Расширенные примеры к тестовым задачам
FizzBuzz: генерация списка с помощью map и lambda
Пример, в котором результат создаётся в виде списка строк.
def fizzbuzz_list(n):
def transform(x):
if x % 15 == 0:
return 'FizzBuzz'
if x % 3 == 0:
return 'Fizz'
if x % 5 == 0:
return 'Buzz'
return str(x)
return list(map(transform, range(1, n + 1)))
result = fizzbuzz_list(20)
print(result[:10]) # первые 10 элементов
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz']
Палиндром: рекурсивная проверка
Рекурсивная функция, которая проверяет только крайние символы.
def is_palindrome_rec(s: str) -> bool:
s = ''.join(ch for ch in s if ch.isalnum()).lower()
if len(s) <= 1:
return True
if s[0] != s[-1]:
return False
return is_palindrome_rec(s[1:-1])
print(is_palindrome_rec('A man, a plan, a canal: Panama'))
print(is_palindrome_rec('race a car'))
True False
Частота символов: получение топ-N символов
Решение с Counter и методом most_common.
from collections import Counter
text = "Hello, world! Programming in Python is fun."
freq = Counter(text.lower())
top_three = freq.most_common(3)
print(top_three)
[(' ', 6), ('o', 4), ('l', 3)]
Анаграммы: работа с файлом и поиск пар
Чтение списка слов из файла и поиск анаграмматических пар.
from collections import defaultdict
def find_anagrams(words):
anagrams = defaultdict(list)
for word in words:
key = ''.join(sorted(word.lower()))
anagrams[key].append(word)
return {k: v for k, v in anagrams.items() if len(v) > 1}
words = ['listen', 'silent', 'enlist', 'python', 'typhon', 'code', 'deco']
result = find_anagrams(words)
for key, group in result.items():
print(f'{key}: {group}')
eilnst: ['listen', 'silent', 'enlist'] hinopty: ['python', 'typhon'] cdeo: ['code', 'deco']