我有一个问题,我需要将数组旋转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。
我的解决方案出了什么问题?
答案 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添加它的正好集合。