📅  最后修改于: 2023-12-03 14:51:03.314000             🧑  作者: Mango
当需要对一个数组进行左旋转时,通常的解决方案是创建一个新的数组,并将原数组中的元素按照旋转的次数进行重新排列。然而,这样的解决方案需要额外的空间复杂度,即 O(n)。在本文中,我们将讨论如何在不使用额外空间的情况下,将数组进行左旋转,并打印结果。
给定一个数组和一个正整数 k
,我们需要将数组左旋转 k
步。左旋转是指将数组的前部分元素移到末尾,并将后部分元素移到前面。例如,对于数组 [1, 2, 3, 4, 5]
,左旋转 2
步后的结果为 [3, 4, 5, 1, 2]
。
我们可以借助三次翻转的方式来实现数组的左旋转。具体步骤如下:
k
个元素翻转,即反转数组的前部分元素。n - k
个元素)翻转,即反转数组的后部分元素。根据上述步骤,我们可以实现一个名为 rotate_print
的函数,它接受一个整数数组 nums
和一个正整数 k
作为参数,并在 O(n) 时间和 O(1) 空间中打印左旋转后的结果。
def reverse(nums, start, end):
while start < end:
nums[start], nums[end] = nums[end], nums[start]
start += 1
end -= 1
def rotate_print(nums, k):
n = len(nums)
k %= n # 处理 k 大于数组长度的情况
reverse(nums, 0, n - 1)
reverse(nums, 0, k - 1)
reverse(nums, k, n - 1)
for num in nums:
print(num)
nums = [1, 2, 3, 4, 5]
k = 2
rotate_print(nums, k)
输出结果:
3
4
5
1
2
该解决方案的时间复杂度为 O(n),其中 n 是数组的长度。这是因为在翻转数组时,每个元素都需要被遍历一次。
该解决方案的空间复杂度为 O(1),因为我们只使用了常量级别的额外空间。
通过使用反转函数和合适的翻转顺序,我们可以在不使用额外空间的情况下打印数组的左旋转结果,时间复杂度为 O(n)。