题目
https://leetcode.cn/problems/rotate-array/?envType=study-plan-v2&envId=top-interview-150
自解
思路分析
- k的值可能大于数组长度,所以真正需要轮转的次数为 k%数组长度(l) k1
- 创建切片,长度为l+k1,将数组整体往后移动k1次
- 将切片的前k1位顺序赋值为切片后k1位
- 切片的值赋值给数组
代码实现
go
func main() {
arr := []int{1, 2, 3}
k := 2
nums := rotate(arr, k)
fmt.Println(nums)
}
// 自解1
func rotate(nums []int, k int) []int {
l := len(nums)
if k == 0 {
return nums
}
if k > l {
k = k % l
}
s1 := make([]int, l+k)
copy(s1, nums)
sLen := len(s1)
slow, fast := sLen-k-1, sLen-1
for fast >= k {
s1[fast] = s1[slow]
fast--
slow--
}
for i := 0; i < k; i++ {
s1[i] = s1[sLen-k+i]
}
for j := 0; j < l; j++ {
nums[j] = s1[j]
}
return nums
}
// gpt 优化1
func rotate(nums []int, k int) {
l := len(nums)
if l == 0 {
return
}
k = k % l // 处理k大于l的情况
reverse(nums, 0, l-1) // 反转整个数组
reverse(nums, 0, k-1) // 反转前k个元素
reverse(nums, k, l-1) // 反转后l-k个元素
}
// 反转数组的部分
func reverse(nums []int, start, end int) {
for start < end {
nums[start], nums[end] = nums[end], nums[start]
start++
end--
}
}
// gpt 优化2
func rotate(nums []int, k int) []int {
l := len(nums)
if l == 0 {
return nums
}
k = k % l // 处理k大于l的情况
if k == 0 {
return nums
}
// 创建一个新的切片,长度为l
s1 := make([]int, l)
// 直接将原数组的元素复制到新数组中,计算新的位置
for i := 0; i < l; i++ {
s1[(i+k)%l] = nums[i]
}
return s1
}
他解
思路分析
代码实现
go