Считайте длину каждой последовательной группы и добавляйте её после символа, включая единицу. Это отличается от варианта 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); для цифр во входе нужна спецификация однозначного декодирования.