左旋转数组

2024-09-19 23:37:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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]

我的算法出了什么问题,我该如何解决?你知道吗


Tags: 代码元素inputshiftdef数组resultpython3
3条回答

rotate方法的第一行有错误:

b = a这样的简单赋值不会像人们期望的那样创建列表的真实副本。相反,这两个变量只是指向内存中的同一个列表。因此,如果您在a中更改某些内容,这些更改也将反映在b中,反之亦然。你知道吗

要创建该数组的新副本,请使用:

b = a[:]

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

您的算法非常好,唯一的问题是b=a使b也指向a,但是您想要的是取a的copy,通过执行列表切片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]

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

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

相关问题 更多 >