Напишите программу, которая выполняет циклический сдвиг части массива, начиная с элемента с номером K и заканчивая элементом с номером M (включительно), влево на R элементов. Нумерация элементов массива начинается с единицы. Входные данные Первая строка содержит размер массива N. Во второй строке через пробел задаются N чисел – элементы массива. Гарантируется, что 0 < N ≤ 10000. В третьей строке через пробел записаны два числа – K (0 < K ≤ N) и M (K ≤ M ≤ N). В четвертой строке записана величина сдвига R (0 ≤ R ≤ N). Выходные данные Программа должна вывести в одну строчку все элементы получившегося массива, разделив их пробелами.
Ответы на вопрос
Для циклического сдвига нужно работать только с частью массива от элемента с номером K до элемента с номером M включительно.
Поскольку в условии элементы нумеруются с единицы, а индексы списка в Python начинаются с нуля, этому фрагменту соответствует срез:
a[k - 1:m]Длина сдвигаемого фрагмента равна:
length = m - k + 1Если величина R больше длины фрагмента, достаточно взять остаток от деления R на длину фрагмента. Например, сдвиг фрагмента длины 5 на 7 элементов равносилен сдвигу на 2 элемента.
n = int(input())
a = list(map(int, input().split()))k, m = map(int, input().split())
r = int(input())
left = k - 1
right = m
length = m - k + 1
r %= length
part = a[left:right]
a[left:right] = part[r:] + part[:r]
print(*a)
Алгоритм выполняется следующим образом:
Определяются границы нужной части массива.
Из массива выделяется фрагмент от
KдоM.Величина сдвига уменьшается по модулю длины фрагмента.
Фрагмент разделяется на две части:
элементы начиная с позиции
R;первые
Rэлементов.
Эти части меняются местами, после чего полученный фрагмент записывается обратно в массив.
Например, для массива:
1 2 3 4 5 6 7при K = 2, M = 6 и R = 2 сдвигается фрагмент:
2 3 4 5 6После циклического сдвига влево на два элемента он принимает вид:
4 5 6 2 3Итоговый массив:
1 4 5 6 2 3 7Временная сложность алгоритма — O(N), так как необходимо сформировать изменённый фрагмент и вывести весь массив. Дополнительная память — O(M - K + 1).
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

