mou*_*nho 5 python algorithm data-structures
我有一个问题,我需要将数组旋转k次.
即,如果k = 2,[1,2,3,4,5]. - > [3,4,5,1,2]
所以,我的代码是:
def array_left_rotation(a, n, k):
for i in range(n):
t = a[i]
a[i] = a[(i+n-1+k)%n]
a[(i+n-1+k)%n] = t
return a
Run Code Online (Sandbox Code Playgroud)
其中n =数组的长度.
我认为问题是映射问题,如果k = 1,则[0] - > a [n-1].
我的解决方案有什么问题?
在索引的帮助下执行此操作的另一种方法如下所示.
def rotate(l, n):
return l[n:] + l[:n]
print(rotate([1, 2, 3, 4, 5], 2))
#output : [3, 4, 5, 1, 2]
Run Code Online (Sandbox Code Playgroud)
如果n超出范围,则仅返回原始列表[-len(l), len(l)].要使其适用于n的所有值,请使用:
def rotate(l, n):
return l[-n % len(l):] + l[:-n % len(l)]
Run Code Online (Sandbox Code Playgroud)
def leftRotation(a, d, n):
i=0
while i < n:
print (a[(i+d)%n], end = ' ')
i+=1
return i
if __name__ == '__main__':
a =[1, 2, 3, 4, 5, 6, 7]
d = 4
n = 7 or len(a)
leftRotation(a, d, n)
Run Code Online (Sandbox Code Playgroud)
这就是我解决我的hackerrank左轮换挑战的方法
小智 5
旋转数组 n 次的一个简单方法是使用切片,
def left_rotate(arr, n):
# arr - array to rotate
# n - n number of rotations
# For number of rotations greater than length of array
n = n % len(arr)
return arr[n:] + arr[:n]
Run Code Online (Sandbox Code Playgroud)
RYS*_*RYS -1
该解决方案需要恒定的额外内存,并且运行时间为 O(nk)。
如果数组长度为零,或者旋转次数为零,则跳过循环并返回 arr。
对于每次旋转,我们存储第一个元素,然后将所有其他元素向左移动,最后将第一个元素放在列表的后面。通过认识到第 n 次之后的每次旋转都是重复解 -> k % n,我们可以节省一些针对较大 k 值的工作。
def array_left_rotation(arr, n, k):
for _ in range(0 if 0 in [n, k] else k % n):
temp = arr[0]
for idx in range(n - 1):
arr[idx] = arr[idx + 1]
arr[-1] = temp
return arr
Run Code Online (Sandbox Code Playgroud)