Есть несколько подходов. Самый элегантный через три разворота. Разворачиваем весь срез, потом первые
k элементов, потом оставшиеся. Три операции, каждая O(n), итого O(n). Память O(1).func rotate(s []int, k int) {
n := len(s)
k = k % n
rev := func(a []int) {
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i]
}
}
rev(s)
rev(s[:k])
rev(s[k:])
}k % n обязателен: если k >= n, сдвиг зацикливается. Без этого для k = n мы получим обратный срез вместо исходного.🐸 Библиотека Go для собеса