Как перевести или сдвинуть значения в срезе в golang? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть срез в golang, скажем, [1 2 3 4 5 6 7 8 9 10], и я хотел бы эффективно сместить значения на другие индексы, например, сдвиг 5 даст 6 [6 7 8 9 101 2 3 4 5].

Я предложил решение, приведенное ниже, но мне интересно, есть ли встроенный или лучший способ сделать это?

https://play.golang.org/p/tkYPkGmffQ1

Ответы [ 2 ]

4 голосов
/ 23 сентября 2019
func translation(nums []int, n int) []int {
    n = n % len(nums)
    return append(nums[n:len(nums):len(nums)], nums[:n]...)
}

достаточно.

nums[n:len(nums):len(nums)] - это " выражение полного среза ", которое гарантирует, что результирующий срез не имеет избыточной емкости (даже если nums имеет).Поскольку он имеет 0 дополнительных мощностей, append должен будет выделить новый массив для размещения дополнительных элементов, и возвращенный фрагмент не будет псевдонимом исходного фрагмента - если только n не равен 0. Если вам нужно обработатьв случае 0, то вы можете сделать это с помощью copy.

0 голосов
/ 23 сентября 2019

Вот одна версия, которая избегает вызова на append и обрабатывает крайний случай, когда смещение не требуется:

func translation(s []int, n int) []int {

    n = n % len(s)
    if n == 0 {
        return s // efficiency where a shift would not be necessary
    }

    // pre-alloc slice and avoiding a realloc if one were to use `append`
    r := make([]int, len(s))
    copy(r, s[n:])
    copy(r[n:], s[:n])

    return r
}
...