← Назад к вопросам
Объединение отсортированных слайсов
2.0 Middle🔥 161 комментариев
#Основы Go
Условие
Даны два отсортированных слайса целых чисел. Объедините их в один отсортированный слайс.
Сигнатура
func mergeSorted(a, b []int) []int
Требования
- Входные слайсы отсортированы по возрастанию
- Результат должен быть отсортирован
- Сложность O(n + m)
Примеры
Вход: a = []int{1, 3, 5}, b = []int{2, 4, 6}
Выход: []int{1, 2, 3, 4, 5, 6}
Вход: a = []int{1, 2, 3}, b = []int{}
Выход: []int{1, 2, 3}
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Reverse words in string — это классическая задача на манипуляцию строками. Нужно развернуть порядок слов, сохраняя сами слова неизменёнными.
Подход
- Разбить строку на слова (по пробелам)
- Развернуть слайс слов
- Объединить обратно в строку
Реализация
package main
import (
"fmt"
"strings"
)
func reverseWords(s string) string {
// Разбить на слова
words := strings.Fields(s) // автоматически удаляет пустые строки
// Развернуть слайс
for i, j := 0, len(words)-1; i < j; i, j = i+1, j-1 {
words[i], words[j] = words[j], words[i]
}
// Объединить обратно
return strings.Join(words, " ")
}
func main() {
// Пример 1
s1 := "Hello World"
fmt.Println(reverseWords(s1)) // World Hello
// Пример 2: множественные пробелы
s2 := " Hello World "
fmt.Println(reverseWords(s2)) // World Hello
// Пример 3: одно слово
s3 := "Go"
fmt.Println(reverseWords(s3)) // Go
}
Альтернативный подход с использованием Split
func reverseWordsManual(s string) string {
// Ручная разбивка на слова
var words []string
word := ""
for _, ch := range s {
if ch == ' ' {
if word != "" {
words = append(words, word)
word = ""
}
} else {
word += string(ch)
}
}
if word != "" {
words = append(words, word)
}
// Развернуть
for i, j := 0, len(words)-1; i < j; i, j = i+1, j-1 {
words[i], words[j] = words[j], words[i]
}
return strings.Join(words, " ")
}
In-place решение на уровне байтов
Если нужно сделать это очень эффективно без доп. памяти для слайса:
func reverseWordsInPlace(s string) string {
// Конвертируем в слайс байтов
b := []byte(s)
// Шаг 1: развернуть всю строку
reverse(b, 0, len(b)-1)
// Шаг 2: развернуть каждое слово обратно
start := 0
for i := 0; i <= len(b); i++ {
if i == len(b) || b[i] == ' ' {
if i > start {
reverse(b, start, i-1)
}
start = i + 1
}
}
return string(b)
}
func reverse(b []byte, start, end int) {
for start < end {
b[start], b[end] = b[end], b[start]
start++
end--
}
}
func main() {
s := "Hello World"
fmt.Println(reverseWordsInPlace(s)) // World Hello
}
Полный код с примерами
package main
import (
"fmt"
"strings"
)
func reverseWords(s string) string {
words := strings.Fields(s)
// Two-pointer развёртка
for i, j := 0, len(words)-1; i < j; i, j = i+1, j-1 {
words[i], words[j] = words[j], words[i]
}
return strings.Join(words, " ")
}
func main() {
testCases := []string{
"Hello World",
" Hello World ",
"the sky is blue",
"a",
" ",
"Go Programming",
}
for _, test := range testCases {
fmt.Printf("Input: \"% s\"\n", test)
fmt.Printf("Output: \"% s\"\n\n", reverseWords(test))
}
}
Анализ сложности
- Временная: O(n) — посещаем каждый символ один раз
- Пространственная: O(n) — слайс слов и объединённая строка