旋转数组

题目描述:

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

思路:

一个比较快捷的方法,对数组进行反转,然后从 k 处分割,再次反转

实现:

package main

import "fmt"

func main() {
	nums := []int{1, 2, 3, 4, 5, 6, 7}
	k := 3
	t := rotate(nums, k)
	fmt.Println(t) //[5 6 7 1 2 3 4]
}

func rotate(nums []int, k int) []int {
	n := len(nums)
	if n == 0 {
		return nums
	}
	k = k % n
	var reverse func(nums []int)
	reverse = func(nums []int) { //反转
		for i, n := 0, len(nums); i < n/2; i++ {
			nums[i], nums[n-1-i] = nums[n-1-i], nums[i]
		}
	}
	reverse(nums)
	reverse(nums[:k])
	reverse(nums[k:])
	return nums
}

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部