JSFiddle - React, Tailwind, and code Playground
by glebcha
JavaScript
/**
* Дана строка, состоящая из букв A-Z:
* "AAAABBBCCXYZDDDDEEEFFFAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBB"
* Нужно написать функцию RLE, которая на выходе даст строку вида:
* "A4B3C2XYZD4E3F3A6B28"
* И сгенерирует любую ошибку, если на вход пришла невалидная строка.
*
* Пояснение:
* 1. если символ встречается 1 раз, он остается без изменений
* 2. если символ повторяется более 1 раза, к нему добавляется количество повторений
*/
var str = 'AAAABBBCCXYZDDDDEEEFFFAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBB';
function rleMap(str) {
if (str.length === 0 || Object.prototype.toString.call(str) !== '[object String]') {
throw('Invalid data')
}
var occurencies = {};
var res = [];
for (var i = 0; i < str.length + 1; i++) {
var char = str.charAt(i);
if (occurencies[char]) {
++occurencies[char];
} else {
if(occurencies[str.charAt(i-1)] > 1) {
res.push(str.charAt(i-1) + '' + occurencies[str.charAt(i-1)]);
} else {
res.push(str.charAt(i-1));
}
delete occurencies[str.charAt(i-1)];
occurencies[char] = 1;
}
}
return res.join('');
}
function rleSimple(str) {
if (str.length === 0 || Object.prototype.toString.call(str) !== '[object String]') {
throw('Invalid data')
}
var occurencies = 1;
var res = '';
for (var i = 0; i < str.length; i++) {
var char = str.charAt(i);
var nextChar = str.charAt(i + 1);
if (char === nextChar) {
++occurencies;
} else {
res += occurencies === 1 ? char : (char + occurencies);
occurencies = 1;
}
}
return res;
}
rleSimple(str);