package com.interview.misc;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* Date 10/10/2016
* @author Tushar Roy
*
* Given a nested list of integers represented as a string, implement a parser to deserialize it.
* Each element is either an integer, or a list -- whose elements may also be integers or other lists.
*
* https://leetcode.com/problems/mini-parser/
*/
public class IntegerListParser {
public NestedInteger deserialize(String s) {
Stack<NestedInteger> stack = new Stack();
NestedInteger current = null;
StringBuffer subInteger = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '[') {
if (current != null) {
stack.push(current);
}
current = new NestedInteger();
subInteger = new StringBuffer();
} else if (s.charAt(i) == ']') {
if (subInteger.length() > 0) {
current.add(new NestedInteger(Integer.parseInt(subInteger.toString())));
subInteger = new StringBuffer();
}
if (!stack.isEmpty()) {
NestedInteger top = stack.pop();
top.add(current);
current = top;
}
} else if (s.charAt(i) == ',') {
if (subInteger.length() > 0) {
current.add(new NestedInteger(Integer.parseInt(subInteger.toString())));
}
subInteger = new StringBuffer();
} else {
subInteger.append(s.charAt(i));
}
}
if (subInteger.length() > 0) {
return new NestedInteger(Integer.parseInt(subInteger.toString()));
}
return current;
}
public String serialize(NestedInteger nestedInteger) {
StringBuffer result = new StringBuffer();
serialize(nestedInteger, result);
return result.toString();
}
private void serialize(NestedInteger nestedInteger, StringBuffer result) {
if (nestedInteger.isInteger()) {
result.append(nestedInteger.getInteger());
return;
}
boolean isFirst = true;
result.append("[");
for (NestedInteger ni : nestedInteger.getList()) {
if (!isFirst) {
result.append(",");
}
isFirst = false;
if (ni.isInteger()) {
result.append(ni.getInteger());
} else {
serialize(ni, result);
}
}
result.append("]");
}
public static void main(String args[]) {
IntegerListParser integerListParser = new IntegerListParser();
NestedInteger nestedInteger = integerListParser.deserialize("123");
String result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[123]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[123,41]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[123,41,[1]]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[123,41,[[[]]]]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[123,41,[[[],[]]]],[],[]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[123,41,[[[121,41,[1]],[2]]]],[2],[4]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
nestedInteger = integerListParser.deserialize("[123,41,[[1,2,[],[]]]],[],[],[[1],[3]]");
result = integerListParser.serialize(nestedInteger);
System.out.println(result);
}
class NestedInteger {
private List<NestedInteger> nestedInteger = new ArrayList<>();
private Integer val;
public NestedInteger() {
}
public NestedInteger(int value) {
this.val = value;
}
public boolean isInteger() {
return val != null;
}
public Integer getInteger() {
return val;
}
public void setInteger(int value) {
this.val = value;
}
public void add(NestedInteger ni) {
this.nestedInteger.add(ni);
}
public List<NestedInteger> getList() {
return val != null ? null : nestedInteger;
}
}
}