Массив левого поворота - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь повернуть массив в python3 влево. Код, который я использую:

def rotLeft(a, d):
    b = a
    lengthOfArray = len(a)
    shift = d

    for i in range (0,lengthOfArray):
        print(a)
        newLocation = (i + (lengthOfArray - shift)) % lengthOfArray
        b[newLocation] = a[i]

    return b

if __name__ == '__main__':

    nd = input().split()

    n = int(nd[0])

    d = int(nd[1])

    a = list(map(int, input().rstrip().split()))

    result = rotLeft(a, d)

    print(result)

Требуется три ввода от пользователя: длина массива элементов, количество вращений и сам массив. Но вместо вращения элементов массив заполняется первым элементом в той же позиции. Например:

Входы:

5 4
12 76 1 09 13

Выход:

[12, 12, 12, 12, 12]

Что не так с моим алгоритмом и как я могу это исправить?

Ответы [ 4 ]

3 голосов
/ 09 мая 2019

В первой строке вашего метода поворота есть ошибка:

Простое назначение, например b = a , не создает реальной копии списка, как можно было бы ожидатьк.Вместо этого обе переменные просто указывают на один и тот же список в памяти.Поэтому, если вы что-то измените в a, изменения также будут отражены в b и наоборот.

К создайте новую копию этого массива, используя:

b = a[:]

Чтобы получить больше возможностей для копирования массива, проверьте это: Как клонировать или скопировать список?

1 голос
/ 09 мая 2019

Используйте модуль копирования для эффективного копирования списка без совместного использования одного и того же адреса в памяти.

import copy

, а затем попробуйте

b = copy.copy(a)

вместо

b = a

Подробнее о том, почему эти два значения различаются, см. https://docs.python.org/2/library/copy.html.

Также, возможно, стоит рассмотреть возможность использования списка:

def rotLeft(a, d):
    lengthOfArray = len(a)
    shift = d
    return [a[i + shift - lengthOfArray] for i in range(lengthOfArray)]
1 голос
/ 09 мая 2019

Ваш алгоритм в порядке, единственная проблема - b=a, заставляет b также указывать на a, но вы хотите взять copy из a, полученного путем нарезки списка b = a[:], а затем код отлично работает.

def rotLeft(a, d):
    #Take copy of a and assign to b
    b = a[:]
    lengthOfArray = len(a)
    shift = d

    for i in range (0,lengthOfArray):
        newLocation = (i + (lengthOfArray - shift)) % lengthOfArray
        b[newLocation] = a[i]

    return b

print(rotLeft([12, 76, 1, 9, 13], 4))

Выход будет

[13, 12, 76, 1, 9]
0 голосов
/ 09 мая 2019

Вы делаете некоторые сложные вещи.Упрости.Вы хотели повернуть влево на «n», поэтому, например, length-of-array (l) = 5, rotate (n) = 3.Возьмите первые 3 элемента из начала и добавьте в конец массива.

Если n> length-of-array (l), тогда возьмите первые элементы «n - [n mod l]» и добавьте черный массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...