Программа курса:
Разбор задачи: Наибольшее время для данных цифр
Предложенный нами код:
from itertools import permutations
def largestTimeFromDigits(arr):
h = m = -float("inf")
for n1, n2, n3, n4 in permutations(arr):
hh, mm = n1 * 10 + n2, n3 * 10 + n4
if 0 <= hh <= 23 and 0 <= mm <= 59 and (hh > h or hh == h and mm > m):
h, m = hh, mm
sh = str(h) if h > 9 else "0" + str(h)
sm = str(m) if m > 9 else "0" + str(m)
return 0 <= h <= 23 and 0 <= m <= 59 and sh + ":" + sm or ""Давайте разберем решение задачи, которое состоит в нахождении максимального времени, которое можно составить из четырех цифр на основе перестановок. Время должно быть в 24-часовом формате, и нужно выбрать максимальное возможное время.
Разбор решения
- Инициализация переменных для хранения времени
h = m = -float("inf")
Здесь мы инициализируем переменные h и m как отрицательные бесконечности. Эти переменные будут хранить максимальные часы и минуты соответственно. Мы используем их, чтобы отслеживать наибольшее валидное время по мере перебора всех возможных перестановок.
- Перебор всех перестановок цифр
for n1, n2, n3, n4 in permutations(arr):
Мы перебираем все возможные перестановки из четырех цифр, переданных в список arr. Функция permutations из библиотеки itertools генерирует все перестановки четырех элементов. Для каждой перестановки мы получаем 4 числа — n1, n2, n3, n4, которые представляют собой четыре цифры.
- Формирование часов и минут
hh, mm = n1 * 10 + n2, n3 * 10 + n4
Мы используем первую пару цифр для формирования часов, а вторую пару — для формирования минут:
hh— это часы, которые получаем, умножая первую цифру на 10 и прибавляя вторую цифру.mm— это минуты, которые получаем аналогично.
Пример: Для перестановки [2, 3, 4, 5]:
hh = 2 * 10 + 3 = 23mm = 4 * 10 + 5 = 45
- Проверка валидности времени
if 0 <= hh <= 23 and 0 <= mm <= 59 and (hh > h or hh == h and mm > m):
Здесь выполняется несколько проверок:
- Валидность часов: Часы должны быть в пределах от 0 до 23 (включительно). Это проверяется условием
0 <= hh <= 23. - Валидность минут: Минуты должны быть в пределах от 0 до 59 (включительно). Это проверяется условием
0 <= mm <= 59. - Нахождение максимального времени: Если часы валидны, мы сравниваем текущее время с уже найденным максимальным временем. Условие
(hh > h or hh == h and mm > m)проверяет, что новое время либо имеет большие часы, либо те же часы, но большие минуты.
Если время валидно и больше найденного, мы обновляем h и m.
- Формирование строки времени
sh = str(h) if h > 9 else "0" + str(h)
sm = str(m) if m > 9 else "0" + str(m)
Когда мы нашли максимальные часы и минуты, мы преобразуем их в строку формата "HH:MM". Для этого мы используем тернарный оператор для проверки, что числа больше 9, и если это так, просто преобразуем их в строку. Если число меньше 10, то добавляем ведущий ноль.
Пример:
- Для
h = 9,m = 5будетsh = "09",sm = "05". - Для
h = 23,m = 59будетsh = "23",sm = "59".
- Возврат результата
return 0 <= h <= 23 and 0 <= m <= 59 and sh + ":" + sm or ""
Здесь мы проверяем, что h и m лежат в допустимом диапазоне (от 0 до 23 для часов и от 0 до 59 для минут). Если это так, мы возвращаем строку в формате "HH:MM". Если нет, возвращаем пустую строку.
Пример:
- Для входных данных
[1, 2, 3, 4]возможные валидные времена: "12:34", "12:43", "13:24", "13:42", "14:23", "14:32", "21:34", "21:43", "23:14", "23:41". Из них наибольшее "23:41". - Для входных данных
[5, 5, 5, 5]все возможные варианты содержат некорректные часы или минуты, поэтому результатом будет пустая строка.