题目:

给定一个字符串 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. 网络io与select

    我们知道网络IO模型一共有5种,这里我们主要讨论同步IO和select多路复用的情况. 我们先从一个简单的TCP服务器的代码出发,来讨论一下这个是怎么实现的. 一个十分简单的TCP服务器 一个简单的T ...

  2. java多线程的锁整理

    参考,欢迎点击原文:https://www.jianshu.com/p/473a3d96a1b0(java锁总结) https://www.jianshu.com/p/dcabdf695557(Ree ...

  3. netty Recycler对象池

    前言 池化思想在实际开发中有很多应用,指的是针对一些创建成本高,创建频繁的对象,用完不弃,将其缓存在对象池子里,下次使用时优先从池子里获取,如果获取到则可以直接使用,以此降低创建对象的开销. 我们最熟 ...

  4. 三维模型3DTile格式轻量化压缩文件大小的技术方法研究

    三维模型3DTile格式轻量化压缩文件大小的技术方法研究 倾斜摄影三维模型,由于数据量大.复杂度高,轻量化压缩成为其在网络传输和实时渲染中必不可少的环节.以下是几种常用的3DTile格式轻量化压缩技术 ...

  5. fyne - 谁说用Go不能开发应用界面

    fyne项目介绍 fyne 是一个纯 Golang 的跨平台 GUI 库,跨平台库说实话,是有很多选择的,Flutter.Electron.QT等.fyne 绝对不是一个很大众的选择.但是在我,一名后 ...

  6. WPF 模仿微信顶部断网提示气泡

    直接看顶部气泡的效果吧 顶部气泡主要要做三个工作 1.定位到顶部居中 2.气泡需要跟随窗体 3.气泡不可以遮挡住其他程序界面 原生的WPF Poupu控件不会跟随目标移动且在Z轴上会置顶,所以存在打开 ...

  7. 阿里云服务器安装mysql后本地连接失败

    阿里云服务器安装mysql后本地连接失败 一.问题描述 在阿里云安装mysql后,想在本地电脑用可视化工具连接mysql,但是提示连接失败 错误如图所示: 二.问题分析 1.检查3306端口 首先,检 ...

  8. 替换Spring容器中已经存在的Bean

    一.背景 我们在开发的过程中,经常会引入别人写的jar包实现某些功能.而别人的jar包一般都自动注入Spring容器中,假设别人都是通过@Bean或@Component注入的,并且没有加入@Condi ...

  9. 解决raw.githubusercontent.com图片无法访问的问题(github图床图片无法显示,但仓库已存储成功)

    解决raw.githubusercontent.com无法访问的问题(picgo+github配置图床图片不显示,但仓库已存储成功) 关于如何配置picgo+github图床参考我的这篇文章: htt ...

  10. [Android开发学iOS系列] iOS项目环境搭建和依赖管理

    iOS项目环境搭建和依赖管理 一个项目总是会依赖一些库, 有些是第三方的, 有些可能是项目自身为了复用拆出去的. 现有主流的iOS依赖有多种形式, 比如CocoaPods, Carthage和swif ...