算法|数组|180.轮转数组

2024/9/6 算法数组

# 题目

https://leetcode.cn/problems/rotate-array/?envType=study-plan-v2&envId=top-interview-150 (opens new window)

# 自解

# 思路分析

  1. k的值可能大于数组长度,所以真正需要轮转的次数为 k%数组长度(l) k1
  2. 创建切片,长度为l+k1,将数组整体往后移动k1次
  3. 将切片的前k1位顺序赋值为切片后k1位
  4. 切片的值赋值给数组

# 代码实现

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

# 他解

# 思路分析

# 代码实现


1
Last Updated: 2024/11/22 17:43:46