Categorías
Algorithms

LeetCode – Mini analizador (Java)

Dada una lista anidada de enteros representados como una cadena, implemente un analizador para deserializarlo. Cada elemento es un número entero, o una lista, cuyos elementos también pueden ser números enteros u otras listas.

Nota: puede suponer que la cadena está bien formada:

  • La cadena no está vacía.
  • La cadena no contiene espacios en blanco.
  • La cadena contiene solo dígitos y «[], «

Por ejemplo,

Given s = "[123,[456,[789]]]",

Return a NestedInteger object containing a nested list with 2 elements:

1. An integer containing value 123.
2. A nested list containing two elements:
    i.  An integer containing value 456.
    ii. A nested list with one element:
         a. An integer containing value 789.

Solución Java

Para resolver este problema, debemos agregar más ejemplos para aclarar cuál es la salida esperada. Por ejemplo, s = «[123,[456], 789]»es una entrada legal.

public NestedInteger deserialize(String s) {
    Stack<NestedInteger> stack = new Stack<>();
    StringBuilder sb = new StringBuilder();
 
    for(int i=0; i<s.length(); i++){
        char c = s.charAt(i);
        switch(c){
            case '[':
                NestedInteger ni = new NestedInteger();
                stack.push(ni);
                break;
 
            case ']':
                if(sb.length()>0){ //123, not [456],
                    stack.peek().add(new NestedInteger(Integer.parseInt(sb.toString())));
                    sb=sb.delete(0, sb.length());
                }
 
                NestedInteger top = stack.pop();
                if(stack.isEmpty()){
                    return top;
                }else{
                    stack.peek().add(top);
                }
 
                break;
            case ',':
                if(sb.length()>0){ //hande case "123," not "[456],"
                    stack.peek().add(new NestedInteger(Integer.parseInt(sb.toString())));
                    sb=sb.delete(0, sb.length());
                }
 
                break;
 
            default: //digits
                sb.append(c);
        }
    }
 
    //handle case "123"
    if(sb.length()>0){
        return new NestedInteger(Integer.parseInt(sb.toString()));
    }
 
    return null;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *