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