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);