Программа курса:
Разбор задачи: Папка журнала краулера
Предложенный нами код решения:
def minOperations(logs):
"""
Вычисляет минимальное количество операций "../", чтобы вернуться в главную папку.
:param logs: список строк, представляющих операции
:return: минимальное количество операций "../"
"""
depth = 0 # Уровень текущей папки относительно главной
for log in logs:
if log == "../": # Переход в родительскую папку
if depth > 0:
depth -= 1
elif log == "./": # Остаёмся в текущей папке
continue
else: # Переход в дочернюю папку
depth += 1
return depth1. Описание параметров и возвращаемого значения
- Параметры:
logs— список строк, где каждая строка представляет операцию с папкой. Возможные значения:"../"— переход в родительскую папку."./"— остаться в текущей папке."x/"— переход в дочернюю папку с именемx.
- Возвращаемое значение:
- Целое число, обозначающее минимальное количество операций
"../"для возвращения в главную папку.
- Целое число, обозначающее минимальное количество операций
2. Пошаговый разбор кода
depth = 0 # Уровень текущей папки относительно главной
Инициализируем переменную depth, которая отслеживает текущую глубину относительно главной папки:
depth = 0соответствует главной папке.- Увеличение
depthозначает переход в дочернюю папку. - Уменьшение
depthпри возврате в родительскую папку.
for log in logs:
Итерируемся по списку операций logs. Каждая операция будет обработана в зависимости от её значения.
Обработка операции "../"
if log == "../": # Переход в родительскую папку
if depth > 0:
depth -= 1
- Если текущая операция — переход в родительскую папку
"../", проверяем:- Если мы уже в главной папке (
depth == 0), игнорируем операцию. - Если находимся в дочерней папке (
depth > 0), уменьшаем глубину на 1.
- Если мы уже в главной папке (
Пример:
Если начальная глубина depth = 2, после выполнения "../" она станет depth = 1.
Обработка операции "./"
elif log == "./": # Остаёмся в текущей папке
continue
- Если текущая операция — остаться в той же папке
"./", пропускаем её, так как она не изменяет глубину.
Пример:
Если начальная глубина depth = 2, после выполнения "./" глубина остаётся depth = 2.
Обработка операции "x/"
else: # Переход в дочернюю папку
depth += 1
- Если текущая операция — переход в дочернюю папку, увеличиваем глубину на 1.
Пример:
Если начальная глубина depth = 1, после выполнения "d1/" она станет depth = 2.
3. Возврат результата
return depth
В конце функции возвращаем значение depth, которое показывает, сколько операций "../" нужно выполнить для возвращения в главную папку.
4. Пример работы кода
Входные данные:
logs = ["d1/", "d2/", "../", "d21/", "./"]
Выполнение:
- Инициализируем:
depth = 0. - Обрабатываем
"d1/": переходим в дочернюю папку →depth = 1. - Обрабатываем
"d2/": переходим в дочернюю папку →depth = 2. - Обрабатываем
"../": возвращаемся в родительскую папку →depth = 1. - Обрабатываем
"d21/": переходим в дочернюю папку →depth = 2. - Обрабатываем
"./": остаёмся в текущей папке →depth = 2.
Результат:
Возвращаем depth = 2, так как для возвращения в главную папку потребуется выполнить 2 операции "../".
5. Визуализация процесса
Главная папка
|
├── d1/ (глубина 1)
| └── d2/ (глубина 2)
├── d21/ (глубина 2 после "../")
В итоге, чтобы вернуться в главную папку, нужно выполнить 2 операции "../".