LeetCode 189. 旋转数组 Golang实现
题目如下:

思路:
- loop一下k,然后用一个变量存放最后一位,把下表1开始的元素往后移动(for i:=len(nums)-1;i>0;i--{}),最后把刚刚存放最后一位的变量填到第一位去 (该思路因超出时间限制不可取)
- 直接把整个数组翻转,在逐步变形,以参数k作为分割线,代表颠倒至前面部分与原始部分,由于最开始进行整体翻转,所以现在的顺序是翻转后的,只需要在进行一次翻转即可
Code:
func rotate(nums []int, k int) {
reverse(nums)
reverse(nums[:k%len(nums)])
reverse(nums[k%len(nums):])
}
func reverse(arr []int){
fmt.Println(arr)
// 对折交换
for i:=0;i<len(arr)/2;i++{
arr[i],arr[len(arr)-1-i]=arr[len(arr)-1-i],arr[i]
}
fmt.Println(arr)
}
这里之所以用k%len(nums)是为了避免多余操作,因为数组旋转是末尾移动到头部,头部后的元素往后移动,所以完整的移动一圈和原本数组结果没有区别。
例如: nums{1,2,3,4,5} k=6
第一次: nums[5,1,2,3,4] k=1
第二次: nums[4,5,1,2,3] k=2
第三次: nums[3,4,5,1,2] k=3
第四次: nums[2,3,4,5,1] k=4
第五次: nums[1,2,3,4,5] k=5
第六次: nums[5,1,2,3,4] k=1
可以看到在第五的时候直接还原回了初始数组,这也就是这里取模的原因
效果图:




本文系作者 @孤独常伴 原创发布在 L0ne1y。未经许可,禁止转载。