算法|数组|180.轮转数组
Fang 2024/9/6 算法数组
# 题目
# 自解
# 思路分析
- k的值可能大于数组长度,所以真正需要轮转的次数为 k%数组长度(l) k1
- 创建切片,长度为l+k1,将数组整体往后移动k1次
- 将切片的前k1位顺序赋值为切片后k1位
- 切片的值赋值给数组
# 代码实现
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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 他解
# 思路分析
# 代码实现
1