es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo implementar la estructura de datos de pila para la extracción de un rango (tarea de Codewars)?

Estoy luchando con el kata de codewars llamado Extracción de rango, que toma una lista de números enteros en orden creciente y devuelve una cadena correctamente formateada en formato de rango (intervalos solapados separados).

Solución de ejemplo:

([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]);
// devuelve “-6, -3-1, 3-5, 7-11, 14, 15, 17-20”

Bueno, en mi solución, en lugar de obtener “-6, -3-1, 3-5, 7-11, 14, 15, 17-20”, obtuve el último elemento “-6,1,5,11,15,20”.

¿Cómo puedo mejorar mi solución? El código:

(function(lista){
var resultado = [];
for(var i=0;i<lista.length;i++){
var e2=lista[i];
var e1=resultado[resultado.length-1];
if(e2-e1==1){
resultado[resultado.length-1]=e2;
}
else{
resultado.push(e2);
}
}
return resultado;
})([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]);

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mejorar la solución, puede modificar el código para construir la cadena de formato de rango comprobando cada elemento de la lista y creando rangos separados basados en su diferencia con el siguiente elemento. Aquí está una solución actualizada:

    function solution(list){
        let result=[]
        let rangeStart = list[0]
        for(let i=1;i<list.length;i++){ let="" diff="list[i]" -="" list[i-1]="" if(diff=""> 1){
                if(rangeStart == list[i-1]){
                    result.push(String(rangeStart))
                }
                else{
                    result.push(rangeStart + '-' + list[i-1])
                }
                rangeStart = list[i]
            }
        }
        if(rangeStart == list[list.length-1]){
            result.push(String(rangeStart))
        }
        else{
            result.push(rangeStart + '-' + list[list.length-1])
        }
        return result.join(',')
    }
    console.log(solution([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]))
    

    La solución modificada verifica la diferencia entre cada elemento y el siguiente y crea un rango siempre que la diferencia sea mayor que 1. También maneja los casos extremos donde la lista termina con un solo elemento o un rango. Finalmente, une el array resultante para generar la cadena formateada deseada.</list.length;i++){>

Comments are closed.