左旋转阵列

时间:2019-05-09 10:13:48

标签: python arrays algorithm data-structures

我试图在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 个答案:

答案 0 :(得分:3)

rotate方法的第一行出现错误:

[13, 12, 76, 1, 9] 这样的简单分配不会创建列表的真实副本,就像人们期望的那样。而是两个变量都指向内存中的相同列表。因此,如果您在b = a中进行了更改,则更改也会反映在a中,反之亦然。

创建该阵列的新副本,请使用:

b

有关复制数组的更多可能性,请查看以下内容:How to clone or copy a list?

答案 1 :(得分:1)

您的算法非常好,唯一的问题是b=a使b也指向a,但是您想要的是取copy的a,这是通过对列表进行切片{{1} },然后代码运行正常。

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))

答案 2 :(得分:1)

使用复制模块有效地复制列表,而无需在内存中共享相同的地址。

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)]

答案 3 :(得分:0)

您正在制作一些复杂的东西。简单点。 您想向左旋转“ n”个位置,例如,数组长度(l)= 5,rotate(n)= 3。从头开始获取前三个元素,然后在数组的后面添加。

如果n>数组长度(l),则首先获取“ n-[n mod l]”个元素,然后在数组的黑色处添加。