题目:

给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。

列表中的每个元素只可能是整数或整数嵌套列表

示例 1:

输入:s = "324",
输出:324
解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。
示例 2:

输入:s = "[123,[456,[789]]]",
输出:[123,[456,[789]]]
解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:
1. 一个 integer 包含值 123
2. 一个包含两个元素的嵌套列表:
i. 一个 integer 包含值 456
ii. 一个包含一个元素的嵌套列表
a. 一个 integer 包含值 789

提示:

  • 1 <= s.length <= 5 * 104
  • s 由数字、方括号 "[]"、负号 '-' 、逗号 ','组成
  • 用例保证 s 是可解析的 NestedInteger
  • 输入中的所有值的范围是 [-106, 106]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/mini-parser
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

最开始看到注解那么多,怕了~

 1 /**
2 *// 这是允许创建嵌列表的接口
3 * // This is the interface that allows for creating nested lists.
4 * // 你不应该实现它,也不应该猜测它的实现
5 * // You should not implement it, or speculate about its implementation
6 * public interface NestedInteger {
7 * // Constructor initializes an empty nested list.
8 * public NestedInteger();( 构造函数初始化一个空的嵌套列表)
9 *
10 * // Constructor initializes a single integer.
11 * public NestedInteger(int value);(构造函数初始化单个整数)
12 *
13 * // @return true if this NestedInteger holds a single integer, rather than a nested list.(如果此NestedInteger包含单个整数,而不是嵌套列表,则返回True)
14 * public boolean isInteger();
15 *
16 * // @return the single integer that this NestedInteger holds, if it holds a single integer(如果NestedInteger包含单个整数,则返回此NestedInteger保存的单个整数)
17 * // Return null if this NestedInteger holds a nested list(如果此NestedInteger包含嵌套列表,则返回NULL)
18 * public Integer getInteger();
19 *
20 * // Set this NestedInteger to hold a single integer.(将此NestedInteger设置为包含单个整数)
21 * public void setInteger(int value);
22 *
23 * // Set this NestedInteger to hold a nested list and adds a nested integer to it.(设置此NestedInteger以保存嵌套列表并向其添加嵌套整数)
24 * public void add(NestedInteger ni);
25 *
26 * // @return the nested list that this NestedInteger holds, if it holds a nested list(如果NestedInteger包含嵌套列表,则返回此NestedInteger保存的嵌套列表)
27 * // Return empty list if this NestedInteger holds a single integer(如果此NestedInteger包含单个整数,则返回空列表)
28 * public List<NestedInteger> getList();
29 * }
30 */

使用栈来存储嵌套的对象,遍历字符串s,对遇到的字符进行分情况讨论:

  • 当字符串开头不是'['时,代表s是纯数字,将数字字符转换成整数返回即可;
  • 如果当前字符是'[',创建一个新NesteInteger对象,压入栈;
  • 如果当前字符是'-',则对负号进行标记;
  • 如果当前字符是数字,则取出连续的数字;
  • 如果当前字符是','或者']',如果这时前面一位为数字,就先判断前面这个数的正负(为负就加上负号),然后对栈顶对象通过add插入数字新生成的NestedInteger对象,重置num和标记位。如果当前栈不为空并且当前位']'(末尾是 ]] 这种情况时),就需要把当前栈顶元素弹出并保存,然后pop栈顶元素,通过add插入到现在的栈顶中。

最后输出栈顶元素就是答案。

代码:

 1 class Solution {
2 public NestedInteger deserialize(String s) {
3 //如果第一个字符不为'[',说明为一个整数
4 if(s.charAt(0) != '['){
5 return new NestedInteger(Integer.parseInt(s));
6 }
7 Deque<NestedInteger> stack = new ArrayDeque<NestedInteger>();
8 //设置整数的初始值
9 int num = 0;
10 //设置符号位初始值(正)
11 boolean sign = false;
12 for(int i = 0; i < s.length(); i++){
13 char c = s.charAt(i);
14 if(c == '['){
15 //创建一个新的实例并压入栈中
16 stack.addLast(new NestedInteger());
17 }else if(c == '-'){
18 sign = true;
19 }else if(Character.isDigit(c)){
20 num = num * 10 + c - '0';
21 }else if(c == ',' || c == ']'){
22 //说明上一个数已经遍历完了
23 if(Character.isDigit(s.charAt(i-1))){
24 //如果存在前一个数为负数
25 if(sign){
26 num *= -1;
27 }
28 //对栈顶对象通过add插入生成数字子串的NestedInteger对象中
29 stack.peekLast().add(new NestedInteger(num));
30 }
31 //重置num和sign
32 num = 0;
33 sign = false;
34 //当栈中上一层有对象时
35 if(c == ']' && stack.size() > 1){
36 //将栈顶的NestedInteger弹出后加入下一个NestedInteger对象,实现嵌套
37 NestedInteger cur = stack.peekLast();
38 stack.pollLast();
39 stack.peekLast().add(cur);
40 }
41 }
42 }
43 return stack.pollLast();
44 }
45 }

力扣385(java)-迷你语法分析器(中等)的更多相关文章

  1. Java实现 LeetCode 385 迷你语法分析器

    385. 迷你语法分析器 给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器. 列表中的每个元素只可能是整数或整数嵌套列表 提示:你可以假定这些字符串都是格式良好的: 字符串非空 字符串 ...

  2. [Swift]LeetCode385. 迷你语法分析器 | Mini Parser

    Given a nested list of integers represented as a string, implement a parser to deserialize it. Each ...

  3. LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)

    本来这次想好好写一下博客的...结果耐心有限,又想着烂尾总比断更好些.于是还是把后续代码贴上.不过后续代码是继续贴在BNF容器里面的...可能会显得有些臃肿.但目前管不了那么多了.先贴上来吧hhh.说 ...

  4. LR(1)语法分析器生成器(生成Action表和Goto表)java实现(一)

    序言 : 在看过<自己实现编译器链接器>源码之后,最近在看<编译器设计>,但感觉伪代码还是有点太浮空.没有掌握的感觉,也因为内网几乎没有LR(1)语法分析器生成器的内容,于是我 ...

  5. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

  6. 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度

    题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...

  7. 力扣1052. 爱生气的书店老板-C语言实现-中等难度

    题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...

  8. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  9. 开源语法分析器--ANTLR

      序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样的DBMS出来:相同,学完 ...

  10. org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 语法分析器在此文档中遇到多个 "64,000" 实体扩展; 这是应用程序施加的限制

    使用SAX解析XML文件.XML文件有1.5G,程序抛出了这个问题: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 语法 ...

随机推荐

  1. 跨域! dev: 'http://192.168.40.81:9090/xxx-api/' 平台和项目 两个都要改 要不会跨域!跨域!跨域!

    跨域! dev: 'http://192.168.40.81:9090/xxx-api/' 平台和项目 两个都要改 要不会跨域!跨域!跨域!

  2. Spring 中不得不了解的姿势

    说明 本文非原创,我只是进行了整理以及做了一些改动,仅供学习,若需进行商业使用,请联系原作者 原作者:苏三 原文链接:苏三说技术:Spring系列 Spring IOC 本章节解读的流程为Spring ...

  3. windows通过cmd重启网卡

    ipconfig/release ipconfig/renew

  4. window-命令行操作

    window命令行操作 调起命令行-win+r输入cmd 网络探活 ping www.baidu.com 快捷启动应用 打开记事本 notepad 打开画图 mspaint 打开计算器 calc 命令 ...

  5. dotNet符号文件(pdb),符号包(snupkg)和SourceLink

    前言 本文的主题是 Visual Studio 调试 NuGet 包,以及符号包的概念,如何去发布一个 NuGet 包,让我们的 NuGet 包支持 SouceLink,这些都是我们开发中比较容易忽视 ...

  6. 【Oracle】通过LogMiner实现Oracle数据同步迁移

    写在前面 最近在研究如何实现Oracle数据库之间的数据同步,网上的资料确实比较少.最好用的Oracle数据库同步工具是:GoldenGate ,而GoldenGate是要收费的.那么还有什么好的办法 ...

  7. Linux开发相关命令整理

    1. 反转shell 2. ldd 3. objdump 4. ldconfig 5. telnet 6. nc 7. netstat 8. ss 9. tcpdump 10. lsof 11. st ...

  8. 使用小皮面板新建站点配置SSL证书

    1.新建站点 2,点开配置->SSL,将证书内容复制进去,点击保存后会在"配置文件"生成一个serve{}代码块 3,删掉默认的serve{},保留经过SSL生成的serve ...

  9. read IEEE Standard for verilog(1)

    IEEE Standard for Verilog Hardware Description Language 英语说明阅读,首先看导读.目录.摘要等内容. 摘要: 1 Abstract: The V ...

  10. KingbaseES V8R6集群运维案例之---repmgrd进程启动无法访问共享内存

    案例说明: KingbaseES V8R6集群在启动repmgrd进程时,出现'unable to write to shared memory'故障,导致repmgrd进程启动终止. 适用版本: K ...