Сжатие строки с подсчётом последовательных символов

Считайте длину каждой последовательной группы и добавляйте её после символа, включая единицу. Это отличается от варианта RLE, где одиночные символы остаются без числа.

Короткий ответ

Что ответить на собеседовании

Считайте длину каждой последовательной группы и добавляйте её после символа, включая единицу. Это отличается от варианта RLE, где одиночные символы остаются без числа.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать функцию compress1, которая преобразует строку, собирая подряд идущие одинаковые символы и заменяя их на символ, за которым следует количество его повторений. В итоге каждая группа одинаковых символов должна быть представлена в виде символа и числа, указывающего, сколько раз он встречается подряд.

// in:  "AAAABBBCCDDD"
// out: "A4B3C2D3"

func compress1(src string) string {
    return ""
}

Ответ

Считайте длину каждой последовательной группы и добавляйте её после символа, включая единицу. Это отличается от варианта RLE, где одиночные символы остаются без числа.

Нужны strings и strconv:

func compress1(src string) string {
    runes := []rune(src)
    var out strings.Builder
    for i := 0; i < len(runes); {
        j := i + 1
        for j < len(runes) && runes[j] == runes[i] { j++ }
        out.WriteRune(runes[i])
        out.WriteString(strconv.Itoa(j-i))
        i = j
    }
    return out.String()
}

Для AAAABBBCCDDD получится A4B3C2D3, для пустой строки — пустая. Код работает с кодовыми точками корректного UTF-8, не с графемами. Время O(n), память O(n); для цифр во входе нужна спецификация однозначного декодирования.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее