RLE заменяет каждую непрерывную серию одинаковых символов парой «длина + символ». В Go для Unicode удобно проходить строку по rune.
// Необходимо реализовать функцию для сжатия строки с использованием алгоритма run-length encoding.
RLE заменяет каждую непрерывную серию одинаковых символов парой «длина + символ». В Go для Unicode удобно проходить строку по rune.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// Необходимо реализовать функцию для сжатия строки с использованием алгоритма run-length encoding. // Если встречается серия одинаковых значений, то она заменяется на длину серии и значение.
func Encode(s string) string { panic("not implemented") }
Ответ
RLE заменяет каждую непрерывную серию одинаковых символов парой «длина + символ». В Go для Unicode удобно проходить строку по rune.
func Encode(s string) string {
var out strings.Builder
var prev rune
count := 0
for _, r := range s {
if count > 0 && r != prev {
fmt.Fprintf(&out, "%d%c", count, prev)
count = 0
}
prev = r
count++
}
if count > 0 {
fmt.Fprintf(&out, "%d%c", count, prev)
}
return out.String()
}
Нужны fmt и strings. Для aaabb получится 3a2b, для пустой строки — пустая строка. Здесь даже одиночный символ получает префикс 1. Если алфавит включает цифры, для однозначного декодирования потребуется разделитель или экранирование; формат задачи этого не задаёт.