Слайс
nums := []int{1, 2, 3}
nums = append(nums, 4)
part := nums[1:3]
len и cap работают за O(1); append иногда перевыделяет массив.
Слайсы, строки и техника изменения данных на месте — база почти каждой задачи.
Минимальный синтаксис, который понадобится в решении.
nums := []int{1, 2, 3}
nums = append(nums, 4)
part := nums[1:3]
len и cap работают за O(1); append иногда перевыделяет массив.
bytes := []byte("hello")
runes := []rune("привет")
var b strings.Builder
byte — для ASCII, rune — для Unicode, Builder — для сборки.
clone := append([]int(nil), nums...)
// или
clone = slices.Clone(nums)
Обычный subslice разделяет память с исходным слайсом.
Три идиоматичных решения на Go с оценкой времени и памяти.
Держим границу уникальной части массива.
O(n) time · O(1) spacefunc removeDuplicates(nums []int) int {
write := 0
for _, n := range nums {
if write == 0 || nums[write-1] != n {
nums[write] = n
write++
}
}
return write
}
Постепенно укорачиваем первый элемент.
O(n · m) time · O(1) spacefunc longestCommonPrefix(words []string) string {
prefix := words[0]
for _, word := range words[1:] {
for !strings.HasPrefix(word, prefix) {
prefix = prefix[:len(prefix)-1]
}
}
return prefix
}
Разбиваем строку по пробелам и собираем слова в обратном порядке.
O(n) time · O(n) spacefunc reverseWords(s string) string {
words := strings.Fields(s)
for left, right := 0, len(words)-1; left < right; left, right = left+1, right-1 {
words[left], words[right] = words[right], words[left]
}
return strings.Join(words, " ")
}