|  | @@ -0,0 +1,60 @@
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * // This is the interface that allows for creating nested lists.
 | 
	
		
			
				|  |  | + * // You should not implement it, or speculate about its implementation
 | 
	
		
			
				|  |  | + * type NestedInteger struct {
 | 
	
		
			
				|  |  | + * }
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * // Return true if this NestedInteger holds a single integer, rather than a nested list.
 | 
	
		
			
				|  |  | + * func (n NestedInteger) IsInteger() bool {}
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * // Return the single integer that this NestedInteger holds, if it holds a single integer
 | 
	
		
			
				|  |  | + * // The result is undefined if this NestedInteger holds a nested list
 | 
	
		
			
				|  |  | + * // So before calling this method, you should have a check
 | 
	
		
			
				|  |  | + * func (n NestedInteger) GetInteger() int {}
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * // Set this NestedInteger to hold a single integer.
 | 
	
		
			
				|  |  | + * func (n *NestedInteger) SetInteger(value int) {}
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 | 
	
		
			
				|  |  | + * func (n *NestedInteger) Add(elem NestedInteger) {}
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * // Return the nested list that this NestedInteger holds, if it holds a nested list
 | 
	
		
			
				|  |  | + * // The list length is zero if this NestedInteger holds a single integer
 | 
	
		
			
				|  |  | + * // You can access NestedInteger's List element directly if you want to modify it
 | 
	
		
			
				|  |  | + * func (n NestedInteger) GetList() []*NestedInteger {}
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +func deserialize(s string) *NestedInteger {
 | 
	
		
			
				|  |  | +	ni := &NestedInteger{}
 | 
	
		
			
				|  |  | +	if s == "[]" {
 | 
	
		
			
				|  |  | +		return ni
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	n := len(s)
 | 
	
		
			
				|  |  | +	if s[0] != '[' {
 | 
	
		
			
				|  |  | +		i, _ := strconv.Atoi(s)
 | 
	
		
			
				|  |  | +		ni.SetInteger(i)
 | 
	
		
			
				|  |  | +		return ni
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	prev, comma := 1, nextComma(s, 1, n-1)
 | 
	
		
			
				|  |  | +	for comma != -1 {
 | 
	
		
			
				|  |  | +		ni.Add(*deserialize(s[prev:comma]))
 | 
	
		
			
				|  |  | +		prev = comma + 1
 | 
	
		
			
				|  |  | +		comma = nextComma(s, prev, n-1)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	ni.Add(*deserialize(s[prev : n-1]))
 | 
	
		
			
				|  |  | +	return ni
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func nextComma(s string, beg, end int) int {
 | 
	
		
			
				|  |  | +	for cnt, i := 0, beg; i < end; i++ {
 | 
	
		
			
				|  |  | +		if s[i] == '[' {
 | 
	
		
			
				|  |  | +			cnt++
 | 
	
		
			
				|  |  | +		} else if s[i] == ']' {
 | 
	
		
			
				|  |  | +			cnt--
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		if cnt == 0 && s[i] == ',' {
 | 
	
		
			
				|  |  | +			return i
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return -1
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 |