对大小数组的左旋转操作将每个阵列元素1单元向左移位。例如,如果在数组[1,2,3,4,5]上执行了2次左旋转,则数组将变为[3,4,5,1,2]。
给定一个整数数组和一个数字,在数组上执行左旋转。然后将更新的数组打印为一行以空格分隔的整数。
示例输入: 5,4 1 2 3 4 5 样品输出:5 1 2 3 4 我的输出是:2 2 3 4 1
#!/bin/python3
import sys
def leftRotation(a, d):
#Main Logic here
length=len(a)
for j in range(0,d):
for i in range(0,length):
temp=a[0]
a[i]=a[i+1]
a[length-1]=temp
return a
return a
return a
if __name__ == "__main__":
n, d = input().strip().split(' ')
n, d = [int(n), int(d)]
a = list(map(int, input().strip().split(' ')))
result = leftRotation(a, d)
print (" ".join(map(str, result)))
答案 0 :(得分:2)
1)返回将停止执行代码,因此代码只会在返回之前循环一次。
2)这些行包含逻辑错误:
temp=a[0]
a[i]=a[i+1]
a[length-1]=temp
要进行左旋转,我们在第一个位置插入最后一个值。您的问题是您在循环内部而不是在外部分配temp = a[0]
。您还要重新分配循环中的最后一个值。
修复了所有错误:
def leftRotation(a, d):
#Main Logic here
length=len(a)
for j in range(0,d):
temp=a[0]
for i in range(0,length - 1):
a[i]=a[i+1]
a[length-1]=temp
return a
给出正确答案。
(P.S。使用标准list方法进行左旋转的方法更简单:a.append(a.pop(0))
。)
答案 1 :(得分:1)
Rassar已经涵盖了代码的问题,我只想使用答案中提到的list
方法添加更好的解决方案:
def left_rotation(l, offset):
offset %= len(l)
return l[offset:] + l[:offset]
result = left_rotation([1, 2, 3, 4, 5], 12)
print(" ".join(str(item) for item in result)) # 3 4 5 1 2
答案 2 :(得分:1)
其他人已经在您的代码中指出了问题,您也可以使用collections.deque
尝试此解决方案:
from collections import deque
def left_rotation(lst, n):
queue = deque(lst)
removed = [queue.popleft() for i in range(n)]
return list(queue) + removed
print(" ".join(map(str, left_rotation([1,2,3,4,5], 2))))
哪个输出:
3 4 5 1 2
注意: popleft()
此处为O(1)
,效率更高pop(0)
,而O(n)
则为import csv
import urllib2
url = 'http://winterolympicsmedals.com/medals.csv'
response = urllib2.urlopen(url)
cr = csv.reader(response)
for row in cr:
print row
。
答案 3 :(得分:0)
首先你的程序没有运行整个(0,d),它在第一次迭代中的结束和左旋转没有完成,因此你的第一和第二个元素具有相同的值
def leftRotation(a, d):
#Main Logic here
length=len(a)
for j in range(0,d):
temp=a[0]
for i in range(0,length):
a[i]=a[i+1] # a[i](i == 0) & a[i+1](i == 1) will have same values
a[length-1]=temp
return a #Because your program is ending here
即使您的代码运行整个迭代,您也会获得IndexError
你正在运行循环(0,长度),当你的i = length-1 => i + 1 =长度&在列表中,我们仅在列表中将“零”索引为“length-1”
现在解决了这两个问题之后,这可能有用: -
def leftRotation(a, d):
#Main Logic here
length=len(a)
for j in range(0,d):
temp=a[0]
for i in range(0,length-1):
a[i]=a[i+1]
a[length-1]=temp
return a
使用列表切片的更好答案: - 。
function rotate_list(a,d):
return a[d:] + a[d:]