Skip to content

在 Go 中,你可以通过简单的切片操作来实现数组的旋转。假设我们有一个数组或切片,并希望将其旋转 k 次(右旋),可以使用以下步骤实现:

示例代码

go
package main

import "fmt"

// Rotate rotates a slice to the right by k steps
func Rotate(nums []int, k int) []int {
    n := len(nums)
    if n == 0 || k%n == 0 {
        return nums
    }
    k = k % n // Ensure k is within bounds
    // Perform the rotation
    return append(nums[n-k:], nums[:n-k]...)
}

func main() {
    nums := []int{1, 2, 3, 4, 5, 6, 7}
    k := 3
    rotated := Rotate(nums, k)
    fmt.Println("Original:", nums)
    fmt.Println("Rotated:", rotated)
}

代码解析

  1. 切片操作:

    • nums[n-k:] 获取数组的最后 k 个元素。
    • nums[:n-k] 获取数组的前 n-k 个元素。
    • 使用 append 拼接后形成旋转后的结果。
  2. 边界处理:

    • 如果数组长度为 0 或者 k 是数组长度的倍数,不需要旋转。
    • 使用 k % n 以确保 k 不会超过数组的长度。

测试输出

对于 nums = [1, 2, 3, 4, 5, 6, 7]k = 3,程序将输出:

Original: [1 2 3 4 5 6 7]
Rotated: [5 6 7 1 2 3 4]

左旋实现

如果需要左旋,可以稍作修改:

go
func RotateLeft(nums []int, k int) []int {
    n := len(nums)
    if n == 0 || k%n == 0 {
        return nums
    }
    k = k % n // Ensure k is within bounds
    return append(nums[k:], nums[:k]...)
}

调用方式与右旋相似,旋转逻辑调整为取前 k 个元素放到末尾即可。