Suma el String - FreeCodeCamp #142 Daily Challenge
2 min
Sum The String - Análisis y Explicación
Enunciado
Dado un string que contiene dígitos y otros caracteres, el objetivo es retornar la suma de todos los números presentes en el string.
- Los números consecutivos forman un solo número. Por ejemplo,
"13"cuenta como 13, no como . - Se deben ignorar el resto de los caracteres no numéricos.
Análisis inicial
Comprensión del problema
La clave reside en identificar secuencias ininterrumpidas de dígitos como una única unidad numérica. No estamos sumando dígitos individuales, sino bloques numéricos.
Casos de prueba identificados
stringSum("3apples2bananas")→5().stringSum("10cats5dogs2birds")→17().stringSum("125344")→125344.stringSum("a1b20c300")→321().
Casos borde:
stringSum("")→0(string vacío).stringSum("abc")→0(sin números).stringSum("0a0b0")→0(ceros explícitos).
Desarrollo de la solución
Enfoque: Expresiones Regulares
Utilizaremos una expresión regular (/\d+/g) para capturar todas las secuencias de uno o más dígitos. Este enfoque es el más eficiente y legible en JavaScript/TypeScript para tareas de extracción de patrones.
Flujo de la solución
flowchart TD
A["Entrada: String"] --> B["Aplicar RegExp: /\d+/g"]
B --> C{¿Hay coincidencias?}
C -- No --> D["Retornar 0"]
C -- Sí --> E["Convertir strings a números"]
E --> F["Sumar con reduce()"]
F --> G["Resultado final"]
Implementación
/**
* Suma todos los números encontrados en un string.
* @param str Cadena de texto a procesar.
* @returns La suma total de los números encontrados.
*/
function stringSum(str: string): number {
// Buscamos secuencias de uno o más dígitos (\d+) globalmente (g)
const matches = str.match(/\d+/g)
if (!matches) {
return 0
}
// Convertimos cada coincidencia a número y acumulamos
return matches.reduce((acc, num) => acc + Number(num), 0)
}
export default stringSumAnálisis de complejidad
Complejidad Temporal
- : Donde es la longitud de la cadena de entrada. El motor de expresiones regulares debe recorrer el string completo una vez para encontrar todas las coincidencias. Posteriormente, el método
reducerecorre las coincidencias encontradas, lo cual es proporcional a en el peor de los casos.
Complejidad Espacial
- : En el peor de los casos (un string compuesto por números separados por un solo carácter no numérico), el array de coincidencias podría ocupar un espacio proporcional al tamaño de la cadena original.
Casos borde y consideraciones
- Sin números: Si el string no contiene dígitos,
matchdevuelvenull. Manejamos esto retornando0inmediatamente. - Números grandes: JavaScript maneja números enteros de forma segura hasta
Number.MAX_SAFE_INTEGER(). Para valores mayores, se requeriríaBigInt. - Ceros: Los ceros a la izquierda en secuencias como
"007"son tratados correctamente porNumber()como7.
Reflexiones y aprendizajes
Conceptos clave
- RegExp: Uso de cuantificadores (
+) y flags (g) para búsqueda global. - Higher-Order Functions: Uso de
reducepara acumulaciones limpias y declarativas. - Manejo de Nullish: Importancia de validar el retorno de
match()antes de operar.