Форум сайта python.su
Добрый вечер. Решаю задачу на сайте
Текст задачи:
Напишите эффективную программу, которая будет циклически сдвигать заданный массив на k элементов вправо. Дополнительные массивы и рекурсию не использовать.
Входные данные
На вход программе сначала подаются значения n100 — количество элементов в массиве и k100. В следующей строке входных данных расположены сами элементы массива — целые числа, по модулю не превосходящие 30 000.
Выходные данные
Выдайте значения элементов массива после выполнения указанной операции.
Примеры
входные данные
5 3
5 4 3 2 1
выходные данные
3 2 1 5 4
Перепробовал, много разных кодов:
n, m = input().split() n = int(n) k = int(m) array = input().split() for i in range(len(array)): array[i] = int(array[i]) k=k%len(array) print(array[-k:] + array[:-k])
n, m = input().split() n = int(n) m = int(m) arr = input().split() for i in range(len(arr)): arr[i] = int(arr[i]) z = 0 while z < m-1: x = arr.pop(0) print(x) arr.append(x) z+= 1 print(arr)
n, m = input().split()
n = int(n)
k = int(m)
array = input().split()
for i in range(len(array)):
array[i] = int(array[i])
k=k%len(array)
if k==len(array) or k == 0:
print(array)
else:
c = n - k
while c < n:
array.append(array[c])
c+=1
c = n - k
while c>=0:
array[c+k]=array[c]
c-=1
c = n - k
i = k - 1
while c < n:
array[i] = array.pop()
c+=1
i-=1
print(array)
Отредактировано valoroso (Ноя. 16, 2016 22:43:02)
Офлайн
Если можно использовать стандартный модуль collections из Python, то решение очень просто:
from collections import deque d = deque(yourlist) d.rotate(k) result = list(d)
Офлайн
Сзаду достаем, вперед вставляем
def shift(lst, k): for _ in range(k): last = lst.pop() lst.insert(0, last) l = [1, 2, 3, 4, 5] shift(l, 3) print(l)
Офлайн
Как ни странно, тут проблема в неправильном понимании задания, а конкретно выходных значений.
Ради интереса добавил строчку:
i = 0 while i!=len(arr): print(arr[i]) i+=1
Отредактировано valoroso (Ноя. 17, 2016 08:56:10)
Офлайн