Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 16, 2016 22:41:58

valoroso
Зарегистрирован: 2016-11-14
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Циклический сдвиг массива

Добрый вечер. Решаю задачу на сайте

Текст задачи:

Напишите эффективную программу, которая будет циклически сдвигать заданный массив на 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])
и с pop/ append
 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)

Офлайн

#2 Ноя. 17, 2016 01:07:32

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Циклический сдвиг массива

Если можно использовать стандартный модуль collections из Python, то решение очень просто:

 from collections import deque
d = deque(yourlist)
d.rotate(k)
result = list(d)

Офлайн

#3 Ноя. 17, 2016 04:53:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Циклический сдвиг массива

Сзаду достаем, вперед вставляем

 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)



Офлайн

#4 Ноя. 17, 2016 08:55:43

valoroso
Зарегистрирован: 2016-11-14
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Циклический сдвиг массива

Как ни странно, тут проблема в неправильном понимании задания, а конкретно выходных значений.
Ради интереса добавил строчку:

 i = 0
while i!=len(arr):
    print(arr[i])
    i+=1
И сразу тест прошел…

Отредактировано valoroso (Ноя. 17, 2016 08:56:10)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version