题目
给定一个整数数组 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]
解题思路
题目不难,重点是解题思路值得小记。
首先,向右轮转 k 个位置可以等同于将最右边的 k 个数移到最左边。
其次,数字的整体位置交换可以不用每换一个就遍历一遍数组,而是可以整体更换。
更换的方法就是旋转整个数组,再旋转指定范围内的数组顺序。负负得正,就获得了一批顺序正常且完成轮转的数组了
代码
func rotate(nums []int, k int) {
k %= len(nums)
reverse(nums)
reverse(nums[:k])
reverse(nums[k:len(nums)])
}
func reverse(a []int) {
for i, n := 0, len(a);i<n/2;i++ {
a[i], a[n-1-i] = a[n-1-i], a[i]
}
}
还有一个小注意点,k可能大于数组长度,所以要取个余