我在leetcode上做了一些工作,提出了可以正常工作的解决方案,但在某些情况下。 这是问题本身:
但是在这种情况下却不会:
如果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
答案 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()
。