题目
给定一个整数数组 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)
}