Программа курса:
Разбор задачи: Сдвиг 2D сетки
Предложенный нами код решения:
def shiftGrid(grid, k):
"""
Выполняет сдвиг элементов 2D сетки k раз.
:param grid: 2D список, представляющий сетку
:param k: количество сдвигов
:return: итоговая 2D сетка после k сдвигов
"""
# Плоский список всех элементов сетки
flattened = [elem for row in grid for elem in row]
# Сдвигаем элементы k раз
k = k % len(flattened) # если k больше размера списка, используем остаток от деления
flattened = flattened[-k:] + flattened[:-k]
# Переводим обратно в 2D сетку
m, n = len(grid), len(grid[0])
result = [flattened[i * n:(i + 1) * n] for i in range(m)]
return result
Нам нужно выполнить сдвиг элементов в двумерной сетке grid размером m x n на k позиций. Сдвиг выполняется следующим образом:
- Каждый элемент в строке перемещается вправо на одну позицию.
- Элемент, который выходит за пределы строки, переносится в начало следующей строки.
- Элемент, который выходит за пределы последней строки, переносится в начало первой строки.
Цель - выполнить сдвиг и вернуть новую сетку после выполнения операции сдвига k раз.
Шаги решения
Преобразование 2D списка в одномерный: Мы начинаем с того, что преобразуем двумерный список (сетку) в одномерный, плоский список. Это делается с помощью списка, который содержит все элементы из каждой строки сетки. Мы проходим через каждую строку и добавляем в итоговый список все элементы из этих строк.
Например, если:
grid = [[1, 2], [3, 4], [5, 6]]то результат преобразования будет:
flattened = [1, 2, 3, 4, 5, 6]Сдвиг элементов: После того как мы получили одномерный список, нужно сдвигать элементы вправо на
kпозиций. Для этого:- Мы вычисляем остаток от деления
kна длину списка, чтобы избежать ненужных полных циклов сдвига (еслиkбольше длины списка, сдвиг наkи наk % len(flattened)даст одинаковый результат). - После этого мы выполняем сдвиг: берем последние
kэлементов и ставим их в начало списка, а оставшуюся часть перемещаем в конец. Это обеспечит нужный сдвиг элементов.
Например, для списка:
flattened = [1, 2, 3, 4, 5, 6]и
k = 2, сдвиг будет:flattened = [5, 6, 1, 2, 3, 4]- Мы вычисляем остаток от деления
Преобразование обратно в 2D сетку: После того как мы сдвинули все элементы в одномерном списке, нужно вернуть их в исходную 2D сетку. Для этого:
- Мы используем размерность исходной сетки (количество строк и столбцов) для того, чтобы разделить одномерный список на несколько строк.
- Каждая строка будет состоять из
nэлементов (гдеn— это количество столбцов), и таким образом, мы восстанавливаем 2D структуру.
Например, если:
flattened = [5, 6, 1, 2, 3, 4]и размер сетки 2x3, то мы получим:
result = [[5, 6, 1], [2, 3, 4]]
Итоговое решение
После выполнения всех этих шагов мы получаем сетку, в которой элементы сдвинуты на k позиций, и возвращаем эту сетку.
Пример
Если входные данные:
grid = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
k = 1
То, после преобразования в одномерный список:
flattened = [1, 2, 3, 4, 5, 6, 7, 8, 9]
После сдвига на 1 позицию:
flattened = [9, 1, 2, 3, 4, 5, 6, 7, 8]
И восстановление в 2D:
result = [[9, 1, 2], [3, 4, 5], [6, 7, 8]]
Заключение
Решение задачи базируется на преобразовании двумерного списка в одномерный, выполнении сдвига и возвращении результата в виде двумерного списка. Этот подход позволяет нам эффективно справиться с задачей с минимальными изменениями в структуре данных.