Estoy tratando de resolver una pregunta para crear una nueva cadena comprimida. Cada carácter tiene un conteo junto a él y se suponía que debía generar una nueva cadena en orden alfabético seguido del conteo total de ese carácter dentro de la cadena.
Por ejemplo:
Entrada: "a10b1a5c1" Salida: "a15b1c1"
Entrada: "b10a1b5c1" Salida: "a1b15c1"
¿Cómo abordé esta pregunta?
function stringCompression(s) { const object={} for(var i=0; i<s.length-1; i++) { if(s[i].match(/[0-9]/)!==null && s[i+1].match(/[a-zA-Z]/) === null) { if(object.hasOwnProperty("s[i]")){ // Add previous and current value } else { object[s[i-1]]=parseInt(s[i]+s[i+1]) } } } return object } // output should be a15b1c1 const output= stringCompression("a10b1a5c1"); const final = Object.keys(output).map(key => `${key}${output[key]}`).join(""); console.log(final)Pregunta:
Puede reduce() todo a un solo objeto de "contador" y luego usar Object.entries() para convertir ese objeto en una matriz y realizar la clasificación , el aplanamiento y la unión en esa matriz:
const compress = (s) => Object.entries( [...s.matchAll(/([A-Za-z])(\d+)/g)].reduce((a, [_, char, number]) => ({ ...a, [char]: (a[char] || 0) + +number }), {}) ).sort(([a], [b]) => a.localeCompare(b)).flat().join(''); console.log(compress('b10a1b5c1')); const STRING = 'a10c8b3a4' const isDigit = (charCode) => { return charCode >= 48 && charCode <=57 } const isAlphabet = (charCode) => { return charCode >= 97 && charCode <= 122 } const getSortedObject = (obj) => { return Object.keys(obj).sort().reduce( (object, key) => { object[key] = obj[key]; return object; }, {} ); } const getCompressedString = (string) => { let obj = {} let alphabet = '' let digit = '' let i = 0 while(i<string.length) { const char = string[i] const charCode = string.charCodeAt(i) if(isAlphabet(charCode)) { alphabet = char if(!obj[alphabet]) { obj[alphabet] = '0' } i++ } else if(isDigit(charCode)) { digit = '0' while(isDigit(string.charCodeAt(i)) && i<string.length) { digit += string[i] i++ } obj[alphabet] = parseInt(obj[alphabet]) + parseInt(digit) } } let compressedString = '' Object.keys(getSortedObject(obj)).forEach(key => {compressedString += key + obj[key]}) return compressedString } console.log(getCompressedString(STRING))