Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/368: Рейтинг темы: голосов - 368, средняя оценка - 4.61
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141

Циклический сдвиг элементов массива на K

09.11.2012, 19:56. Показов 72899. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
дан массив, нужно его циклически сдвинуть на К, если К>0 вправо, K<0 влево

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
a = map(int,raw_input().split())
k = input()
m = 0
while k > len(a):
    k -= len(a)
if k > 0:
    while k != 0:
        i = len(a)-1
        m = a[i]
        for i in range(len(a)-1,0,-1):
            a[i] = a[i-1]
        a[0] = m
        k -= 1
else:
    while k != 0:
        i = 0
        m = a[i]
        for i in range(len(a)-1):
            a[i] = a[i+1]
        a[len(a)-1] = m
        k += 1
for x in a:
    print x
это медленно, как побыстрее????
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2012, 19:56
Ответы с готовыми решениями:

Циклический сдвиг элементов массива вправо
Дан одномерный массив числовых значений, насчитывающий N элементов. Выполнить перемещение элементов массива по кругу вправо, т. е. A...

Циклический сдвиг элементов массива влево на R элементов
Напишите программу, которая выполняет циклический сдвиг элементов массива влево на R элементов. Входные данные Первая строка...

Осуществить циклический сдвиг элементов массива влево на одну позицию
Дан массив размера N. Осуществить циклический сдвиг элементов массива влево на одну позицию (при этом AN перейдет в AN −1, AN −1 — в AN...

15
исследователь
325 / 104 / 3
Регистрация: 18.03.2010
Сообщений: 1,079
Записей в блоге: 2
09.11.2012, 20:51
Быстрее было бы используя pop ну или insert для добавления и срез для удаления дублей.
Код писать неохота.

Добавлено через 16 минут
Зачем перестраивать весь массив (список) если можно команду insert для списков (вставка).
1
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.11.2012, 21:26
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> l = [1, 2, 3, 4, 5]
>>> def rotate(l, n):
...     return l[-n:] + l[:-n]
... 
>>> rotate(l, 2)
[4, 5, 1, 2, 3]
>>> rotate(l, -2)
[3, 4, 5, 1, 2]
>>> from collections import deque
>>> d = deque([1, 2, 3, 4, 5])
>>> d.rotate(2)
>>> print(d)
deque([4, 5, 1, 2, 3])
>>> d.rotate(-4)
>>> print(d)
deque([3, 4, 5, 1, 2])
3
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
11.11.2012, 10:34  [ТС]
ребят это все конечно классно, и это работает, но мне нужно не совсем это)) Мне бы понять как мне использовать при помощи обычного кода а не каких-то встроенных функций питона, сам алгоритм. Как я понимаю для ускорения нужно перевернуть массив, а потом смотреть что будет на краях
0
 Аватар для AciD
22 / 22 / 19
Регистрация: 25.10.2011
Сообщений: 122
11.11.2012, 12:07
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
def lol(lst,k):
    k=k%len(lst)
    ret=[0]*len(lst)
    for i in range(len(lst)):
        if i+k<len(lst) and i+k>=0:
            ret[i]=lst[i+k]
        if i+k>=len(lst):
            ret[i]=lst[i+k-len(lst)]
        if i+k<0:
            ret[i]=lst[i+k+len(lst)]
 
    return(ret)
алгоритм, думаю, понять труда не составит.
1
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.11.2012, 12:12
maniac0192, строки 2-3. Никаких встроенных функций питона.
1
 Аватар для AciD
22 / 22 / 19
Регистрация: 25.10.2011
Сообщений: 122
11.11.2012, 12:20
soon,
Однако там есть недочет... Например N больше длины списка.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.11.2012, 12:21
AciD, это уже на совести ТС.
1
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
12.11.2012, 00:09  [ТС]
[/PYTHON]
алгоритм, думаю, понять труда не составит.[/QUOTE]


Конечно, большое спасибо))

Добавлено через 2 часа 38 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
a = map(int,raw_input().split())
k = input()
k = k % len(a)
for i in range(len(a)):
    if i + k < len(a) and i + k > 0:
        a[i] = a[i+k]
        if i + k >= len(a):
            a[i] = a[i+k-len(a)]
        if i + k < 0:
            a[i] = a[i+k+len(a)]
for x in a:
    print x
я переписал как вы говорили, но оответ неверный получается
3 4 5 6 7 на 3
6
7
5
6
7
0
 Аватар для AciD
22 / 22 / 19
Регистрация: 25.10.2011
Сообщений: 122
12.11.2012, 02:18
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def lol(lst,k):
    k=k%len(lst)
    k=-k
    ret=[0]*len(lst)
    for i in range(len(lst)):
        if i+k<len(lst) and i+k>=0:
            ret[i]=lst[i+k]
        if i+k>=len(lst):
            ret[i]=lst[i+k-len(lst)]
        if i+k<0:
            ret[i]=lst[i+k+len(lst)]
 
    return(ret)
Скинул не то случайно, вот тесты:
Python
1
2
3
4
5
6
>>> a=[3,4,5,6,7]
>>> lol(a,3)
[5, 6, 7, 3, 4]
>>>a=[1,2,3]
>>> lol(a,2)
[2, 3, 1]
А вообще идеальный по времени на мой взгляд код, предложил soon
Только остается добавить оператор % к n
1
2 / 2 / 0
Регистрация: 16.01.2011
Сообщений: 33
21.09.2014, 17:53
А со строковым массивом как быть?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
22.09.2014, 10:26
В numpy для этого служит функция roll.
0
0 / 0 / 0
Регистрация: 03.11.2018
Сообщений: 1
03.11.2018, 09:58
Python
1
2
3
4
5
6
7
8
9
test = list(range(0,5))           # список 
print(test)
 
for i in range(5):
    o = len(test) - 1             # сколько элементов в списке test
    p = test[o]                   # последний элемент
    test.remove(p)                # удалить последний элемент
    test2 = test.insert(0,p)      # поставить последний элемент на первую позицию 
    print(test)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
03.11.2018, 12:36
мои 5 копеек
Python
1
2
3
4
5
6
7
8
9
>>> l = [1,2,3,4,5]
>>> def f(n,l):
    return l[-n:] + l[:-n]
 
>>> f(1,l)
[5, 1, 2, 3, 4]
>>> f(-1,l)
[2, 3, 4, 5, 1]
>>>
1
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
03.11.2018, 13:12
Обсидиановая_лопата.jpg
1
0 / 0 / 0
Регистрация: 17.03.2019
Сообщений: 47
24.03.2019, 14:11
Python
1
2
3
4
5
6
7
8
9
10
11
n = int(input())
a = list(map(int, input().split()))
z = int(input())
s = n-z
 
for i in range(0, s):
    a.append(a[0])
    a.remove(a[0])
    s = s-1
 
print(*a)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2019, 14:11
Помогаю со студенческими работами здесь

Циклический сдвиг отрицательных элементов массива на К позиций вправо а положительные записать в обратном порядке
Доброго времени суток, мне нужно совершить циклический сдвиг отрицательных элементов массива на К позиций вправо, а все положительные...

Циклический сдвиг массива
Нужно решение пока не хватает знаний =) 1. Дан массив x из n элементов. Найдите x1−x2+x3−…−xn−1+xn. ...

Циклический сдвиг массива влево
Напишите программу, которая выполняет циклический сдвиг элементов массива влево на R элементов. (Используйте массив) Входные данные ...

Циклический сдвиг массива вправо
Напишите программу, которая выполняет циклический сдвиг элементов массива вправо на R элементов. (Используйте массив) Входные данные ...

Циклический сдвиг отрезка массива влево
Напишите программу, которая выполняет циклический сдвиг части массива, начиная с элемента с номером K и заканчивая элементом с номером M...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru