迷你语法分析器
给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。
列表中的每个元素只可能是整数或整数嵌套列表
示例一:
输入:s = “324”,
输出:324
解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。
示例二:
输入:s = “[123,[456,[789]]]”,
输出:[123,[456,[789]]]
解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:
- 一个 integer 包含值 123
- 一个包含两个元素的嵌套列表:
i. 一个 integer 包含值 456
ii. 一个包含一个元素的嵌套列表
a. 一个 integer 包含值 789
/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* function NestedInteger() {
*
* Return true if this NestedInteger holds a single integer, rather than a nested list.
* @return {boolean}
* this.isInteger = function() {
* ...
* };
*
* Return the single integer that this NestedInteger holds, if it holds a single integer
* Return null if this NestedInteger holds a nested list
* @return {integer}
* this.getInteger = function() {
* ...
* };
*
* Set this NestedInteger to hold a single integer equal to value.
* @return {void}
* this.setInteger = function(value) {
* ...
* };
*
* Set this NestedInteger to hold a nested list and adds a nested integer elem to it.
* @return {void}
* this.add = function(elem) {
* ...
* };
*
* Return the nested list that this NestedInteger holds, if it holds a nested list
* Return null if this NestedInteger holds a single integer
* @return {NestedInteger[]}
* this.getList = function() {
* ...
* };
* };
*/
/**
* @param {string} s
* @return {NestedInteger}
*/
var deserialize = function(s) {
return parse(JSON.parse(s))
};
function parse(a) {
let ret = new NestedInteger();
if(!(a instanceof Array)) {
ret.setInteger(a)
return ret
}
for(let i of a) {
if(i instanceof Array) {
ret.add(parse(i))
} else {
ret.add(new NestedInteger(i))
}
}
return ret
}
这道题讲道理的说我看不懂,看不懂题想要干些什么,最后多少是有点理解:不论传来的参数是什么,你都需要返回一个对象
NestedInteger
,如果对象中的值有嵌套的数组,你就同样给返回。
在参考题解大佬的代码后,绝对大佬写的非常的好,首先使用JSON.prae()
,这个的目的是将传来的字符串转化为对象形式
,而该题的要求就是返回一个对象,随后封装一个方法parse()
处理该对象中的值,在函数中又创建一个新对象,方法体中首先做一个判断:传进来的对象是不是直接就是一个数组,(注:instanceof
是一个简单的判断,这里的a instanceof Array
的意思是判断a是不是一个数组)
如果a不是一个数组则直接将a作为一个值添加到ret这个对象中,并且直接返回
如果a是一个数组,则对该数组进行遍历,遍历后还要判断i
是不是一个数组,如果是一个数组的话还要接着进行执行parse()
方法(注:这里又调用了方法parse()
就是我们所说的递归思想
)如果i不是一个数组,则将i传入新建的对象中,然后以对象形式添加到ret中,随后进行返回。