在数组上左旋转

时间:2018-03-24 07:08:43

标签: 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

其中n =数组的长度。

我认为问题是映射问题,[0] - > a [n-1]如果k = 1。

我的解决方案出了什么问题?

10 个答案:

答案 0 :(得分:6)

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

def rotate(l, n):
    return l[n:] + l[:n]

print(rotate([1, 2, 3, 4, 5], 2))

#output : [3, 4, 5, 1, 2]

如果n超出范围[-len(l), len(l)],则仅返回原始列表。要使其适用于n的所有值,请使用:

def rotate(l, n):
  return l[-n % len(l):] + l[:-n % len(l)]

答案 1 :(得分:2)

您可以采用collections.deque

的方法
from collections import deque
k = 2
l = [1, 2, 3, 4, 5]
dl = deque(l)
dl.rotate(k+1)
list(dl)
#[3, 4, 5, 1, 2]

答案 2 :(得分:1)

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)

这就是我解决hackerrank左旋转挑战的方法

答案 3 :(得分:1)

将数组旋转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]

答案 4 :(得分:0)

此解决方案需要恒定的额外内存,并以O(nk)运行。

如果数组长度为零,或者零旋转,则跳过循环并返回arr。

对于每个旋转,我们存储第一个元素,然后将每个其他元素向左移动,最后将第一个元素放在列表的后面。我们通过识别第n个之后的每个旋转都是重复解决方案来节省大量k值的工作 - &gt; k%n。

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

答案 5 :(得分:0)

N, d = map(int, input().split())     #taking length N and no. of rotations d
a = list(input().split())            #taking input array as list
r = a[d % N : N] + a[0 : d % N]      #rotating the array(list)
print(r)  

5 2                            #giving N,D as input
1 2 3 4 5                      #giving input array
['3', '4', '5', '1', '2']      #output

答案 6 :(得分:0)

def rotate_left(array, shift):
 length = len(array)
 overflow = length * (shift//length + 1)
 return [array[i+shift - overflow] for i in range(length)]

如果您也输入负数也可以使用,因此您可以根据需要向右旋转。

不利之处在于它没有在原地旋转,所以您得到了一个新的数组,但是由于您的解决方案返回了一个数组,因此保持原始数组不变是更有意义的。

数组中各项的新索引是当前索引,再加上要移动的距离(尽管实际上会将它们向右移动)减去数组周围需要多少次再加上一。加号强制结果索引为负,因此我们从背面遍历原始数组。

答案 7 :(得分:0)

请尝试:

import math
import os
import random
import re
import sys



if __name__ == '__main__':

    n = 5  #number of elements

    d = 4  #number of times left operation needs to be performed

    a = [1,2,3,4,5] #array to be rotated

    def leftRotate(a, n, d): 
        # To get the starting point of rotated array 
        mod = d % n 
        print(mod)


    # Prints the rotated array from start position 
        for i in range(n): 
            print (str(a[(mod + i) % n]), end = ' ')

(leftRotate(a, n, d))

答案 8 :(得分:-1)

def rotate_left3(nums):
temp=[]
for i in range(len(nums)-1):
  temp=nums[i]
  nums[i]=nums[i+1]
  nums[i+1]=temp

return nums

答案 9 :(得分:-2)

这是我的方法:

def rotate_left3(nums):
    return [ nums[1] , nums[2] , nums[0] ]

它能完美地工作100%,但是如果您添加更多的总和,则必须为问题指定的3添加它的正好集合。