题目:

给定一个字符串 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. 基于ADS1292芯片的解决方案之芯片简析

    基本资料: ADS1292芯片是多通道同步采样 24 位 Δ-Σ 模数转换器 (ADC),它们具有内置的可编程增益放大器 (PGA).内部基准和板载振荡器. ADS1292 包含 便携式 低功耗医疗心 ...

  2. ble无线智能工牌解决方案技术解析

    场景需求  在无线智能工牌领域,团队做了几个实际场景的解决方案之后,积累了一些行业需求经验和技术经验.这里做一个总结,算是一种沉淀吧.场景一:居家养老,医护和护工人员定期上门服务,根据工作时长来发工资 ...

  3. NJUPT自控第一次积分赛的小总结(二)基于simpleFOC的无刷电机控制

    新人一枚,写的比较水,欢迎大佬指正! 先说一下我用的物料与开发环境吧: 无刷电机:makerbase的2804电机(带AS5600磁编码器) 电机驱动板:simpleFOCmini(学校推荐的) 电池 ...

  4. 3DCAT首届行业生态交流会|爱智慧科技有限公司CEO梁新刚:工业元宇宙的”形“与”神“

    2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的 云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会 圆满落幕.此次活动围绕"云XR如 ...

  5. 深度观察2024中国系统架构师大会(SACC)

    今年的中国系统架构师大会(SACC)在我所在的城市广州举办,很荣幸受邀参加.这次能接触到国内最优秀的架构师,学习他们的架构思想和行业经验.对我而言非常有意义. 大会分为上下午共4场,我参加了上午的多云 ...

  6. 记录--『uni-app、小程序』蓝牙连接、读写数据全过程

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本文简介 这是一次真实的 蓝牙收发数据 的全过程讲解. 本文使用 uni-app + Vue3 的方式进行开发,以手机app的方式运行(微 ...

  7. vivado的非嵌入ILA的使用

    vivado非嵌入ILA的使用 1.实验原理 前面在vivado中联合vitis设计时接触过ila,那个时候采用的方法是直接调用IP核在原理图中连接.这个方法简单直接,可以将自己所需的测量信号转移到I ...

  8. PS的流水灯设计分析

    PS的流水灯设计分析 1.实验原理 PS设计流水灯就是采用ARM的硬核实现流水灯设计.ARM内核采用的就是一个可以执行软件程序的平台.这里采用C语言设计.基于前面构建的GPIO外设的硬件平台,这里实现 ...

  9. YOLACT++ : 实时实例分割,从29.8mAP/33.5fps到34.1mAP/33.5fps

    YOLACT是首个实时实例分割算法,但是准确率较SOTA差得有点多,YOLACT++从主干网络.分支和anchor的3个角度出发对YOLACT进行优化,在保持实时性的前提下提升了5map,论文改进的角 ...

  10. Emmet Documentation ( Abbreviations+CSS Abbreviations )

    Emmet Documentation Emmet - the essential toolkit for web-developers Abbreviations Abbreviations Syn ...