Python 左旋转阵列
我试图在python3中左旋转一个数组。我使用的代码是:Python 左旋转阵列,python,arrays,algorithm,data-structures,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[
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]
我的算法出了什么问题,我该如何修复它?你的算法非常好,唯一的问题是
b=a
使b也指向a,但你想要的是复制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]
旋转方法的第一行出现错误:
像b=A
这样的简单赋值不能像人们期望的那样创建列表的真实副本。相反,这两个变量只是指向内存中的同一个列表。因此,如果您在a
中更改了某些内容,这些更改也将反映在b
中,反之亦然
要创建该阵列的新副本,请使用:
b = a[:]
有关复制阵列的更多可能性,请查看以下内容:您正在制作一些复杂的东西。简单点。
您希望向左旋转“n”个位置,例如数组长度(l)=5,旋转(n)=3。从开始处获取前3个元素,并添加到数组的后面
如果n>数组长度(l),则首先取“n-[n mod l]”元素并在数组的黑色处添加。使用复制模块有效地复制列表,而无需在内存中共享相同的地址。
然后试试看
b = copy.copy(a)
而不是
b = a
有关这两者不同的原因的详细信息,请参阅
也可以考虑使用列表理解:
def rotLeft(a, d):
lengthOfArray = len(a)
shift = d
return [a[i + shift - lengthOfArray] for i in range(lengthOfArray)]
可能重复的b=a
不会复制列表<代码>a
和b
是对同一列表的引用。因此,b[newLocation]=a[i]
的结果与,a[newLocation]=a[i]
参见,
def rotLeft(a, d):
lengthOfArray = len(a)
shift = d
return [a[i + shift - lengthOfArray] for i in range(lengthOfArray)]