Считайте длину каждой последовательной серии и записывайте букву с числом, если оно больше единицы. В примере опечатка: rle('AAAAB') должно возвращать 'A4B', не 'A3B'.
Кодирование строки методом RLE
Считайте длину каждой последовательной серии и записывайте букву с числом, если оно больше единицы. В примере опечатка: rle('AAAAB') должно возвращать 'A4B', не 'A3B'.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана строка, состоящая из заглавных латинских букв A‑Z, например: "AAAABBBCCXYZDDDEEFFFFAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBB". Требуется реализовать функцию rle, которая преобразует её в форму, где подряд идущие одинаковые символы заменяются символом и количеством их повторений. Результат для приведённого примера должен выглядеть так: "A4B3C2XYZDAE3F3 328".
Важно:
- Если символ встречается единожды, он оставляется без изменений.
- Если символ повторяется более одного раза, к нему сразу же добавляется число его повторений.
function rle(str) {
// your code here
}
rle('A') // A
rle('AAAAB') // A3B
rle('ABCCC') // ABC3
Напишите реализацию, учитывающую указанные правила.
Ответ
Считайте длину каждой последовательной серии и записывайте букву с числом, если оно больше единицы. В примере опечатка: rle('AAAAB') должно возвращать 'A4B', не 'A3B'.
function rle(str) {
if (!/^[A-Z]*$/.test(str)) throw new Error('Ожидаются буквы A-Z');
const result = [];
for (let start = 0; start < str.length;) {
let end = start + 1;
while (end < str.length && str[end] === str[start]) end++;
const count = end - start;
result.push(str[start] + (count > 1 ? String(count) : ''));
start = end;
}
return result.join('');
}
Одиночные X, Y, Z остаются без цифр; пустая строка даёт пустую строку. Длинный ожидаемый результат в условии также повреждён и противоречит правилу серий. Время O(n), память O(n) на результат.