在数组上左旋转

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

我的解决方案有什么问题?

Sre*_* TP 9

在索引的帮助下执行此操作的另一种方法如下所示.

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)


Ken*_*ogo 5

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)