【力扣】6. 轮转数组

79 阅读1分钟

题目

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

示例 1:
输入: 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]

示例 2: 输入: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

题解

个人题解

排除特殊情况(切片长度=1 =0, k取0), 对 k 按 切片长度取余,ans 先将 nums 后面 k 个长度元素存取,在存取前面 length-k 个长度。(取巧偷懒😂)

func rotate(nums []int, k int) {
   length := len(nums)
   // 特殊情况
   if length == 1 || length == 0 || k == 0 {
      return
   }
   // 旋转次数超过 切片长度  进行取余操作
   if k > length {
      k = k % length
   }
   // 额外切片进行结果整合
   ans := make([]int, length)
   ans = nums[length-k:]
   ans = append(ans, nums[:length-k+1]...)
   // 将nums里的数值修改为结果值
   copy(nums, ans)

}

官方题解

使用额外的数组 类似我上述方法

func rotate(nums []int, k int) {
    newNums := make([]int, len(nums))
    for i, v := range nums {
        newNums[(i+k)%len(nums)] = v
    }
    copy(nums, newNums)
}