如何改善我的“旋转(滚动/循环排列)数组”解决方案?

时间:2019-07-18 00:38:49

标签: algorithm circular-permutations

我在leetcode上做了一些工作,提出了可以正常工作的解决方案,但在某些情况下。 这是问题本身:

enter image description here

但是在这种情况下却不会:

enter image description here

如果k大于数组的长度,如何旋转元素没有意义。 如果您有任何想法来改进此解决方案,我将不胜感激

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if len(nums) > k:
            self.swap(nums, 0, len(nums)-1)
            self.swap(nums, 0,k-1)
            self.swap(nums, k, len(nums)-1)


    def swap(self, nums, start, end):

        while start < end:
            nums[start], nums[end] = nums[end], nums[start]
            start+=1
            end-=1

2 个答案:

答案 0 :(得分:2)

为了理解为什么**/path/data.csv**大于数组长度的情况下这种方法不起作用,让我尝试解释通过k的值进行旋转的某些逻辑。

模运算符k将很有用。例如,如果一个数组长为5,而您想旋转5,则最终得到相同的数组。因此,从技术上讲,您最好将其旋转0。这就是%运算符的作用。 %。如果我们想将数组长度5旋转7个点,最终将得到与数组旋转2相同的结果,结果就是5 % 5 = 0。你知道我要去哪里吗?

如果7 % 5 = 2的值小于数组的长度,则也是如此。假设我们想将数组长度5旋转3,则执行k

因此,对于数量为3 % 5 = 3和数组长度为k的任何旋转,优化旋转量L等于n

您应该在rotate方法的开头修改代码以调整旋转量:

n = k % L

并使用此值旋转正确的量。

答案 1 :(得分:0)

到目前为止,最快,最干净的解决方案是:

def rotate_right(items, shift):
    shift = -shift % len(items)
    return items[shift:] + items[:shift]


ll = [i + 1 for i in range(7)]
# [1, 2, 3, 4, 5, 6, 7]
rotate_right(ll, 3)
# [5, 6, 7, 1, 2, 3, 4]

rotate_right([1, 2], 3)
# [2, 1]

当然,没有使用numpy.roll()itertools.cycle()