← Назад к вопросам

Объединение отсортированных слайсов

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 — это классическая задача на манипуляцию строками. Нужно развернуть порядок слов, сохраняя сами слова неизменёнными.

Подход

  1. Разбить строку на слова (по пробелам)
  2. Развернуть слайс слов
  3. Объединить обратно в строку

Реализация

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) — слайс слов и объединённая строка