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

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

09.11.2012, 19:56. Показов 72553. Ответов 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
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru