力扣385(java)-迷你语法分析器(中等)
题目:
给定一个字符串 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)-迷你语法分析器(中等)的更多相关文章
- Java实现 LeetCode 385 迷你语法分析器
385. 迷你语法分析器 给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器. 列表中的每个元素只可能是整数或整数嵌套列表 提示:你可以假定这些字符串都是格式良好的: 字符串非空 字符串 ...
- [Swift]LeetCode385. 迷你语法分析器 | Mini Parser
Given a nested list of integers represented as a string, implement a parser to deserialize it. Each ...
- LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)
本来这次想好好写一下博客的...结果耐心有限,又想着烂尾总比断更好些.于是还是把后续代码贴上.不过后续代码是继续贴在BNF容器里面的...可能会显得有些臃肿.但目前管不了那么多了.先贴上来吧hhh.说 ...
- LR(1)语法分析器生成器(生成Action表和Goto表)java实现(一)
序言 : 在看过<自己实现编译器链接器>源码之后,最近在看<编译器设计>,但感觉伪代码还是有点太浮空.没有掌握的感觉,也因为内网几乎没有LR(1)语法分析器生成器的内容,于是我 ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度
题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...
- 力扣1052. 爱生气的书店老板-C语言实现-中等难度
题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- 开源语法分析器--ANTLR
序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样的DBMS出来:相同,学完 ...
- org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 语法分析器在此文档中遇到多个 "64,000" 实体扩展; 这是应用程序施加的限制
使用SAX解析XML文件.XML文件有1.5G,程序抛出了这个问题: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 语法 ...
随机推荐
- 吐槽 Android的WebView的pauseTimers方法神坑 webview加载卡住
原文: 吐槽 Android的WebView的pauseTimers方法神坑 webview加载卡住 | Stars-One的杂货小窝 说明 之前公司的项目和别的公司一起合作,忽然出现情况,进入到他们 ...
- [置顶]
drools规则引擎因为内存泄露导致的内存溢出
进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...
- 记一次由于linux buff cache引发的问题
简介 在前一段时间,在帮一个朋友处理一个问题是时,遇到这么一个问题.功能做的是一个vue分片式上传,在测试定位问题时,我就发现,分片上传14次,其中有那么一两次是上传失败,导致文件上传不完整.报了以下 ...
- springboot 低于 2.6 版本设置 SameSite=None,springboot 1.x set SameSite=none in embedded tomcat
speingboot 使用自带的 tomcat 运行,设置 SameSite. springboot 过低的版本没有 SameSite 的属性设置,升级到 1.5.22 版本后,虽然 Rfc6265C ...
- 上位机连接PLC
上位机使用Hsl框架连接PLC 顺便讲下策略模式 话不多说,直接上代码 public interface IPlcHost { bool ConnectionPlc(string path); } p ...
- 记录--H5 视频兼容性处理总结
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 概述 最近在负责公司官网的开发,在 H5 播放视频时,遇到很多兼容问题,所以总结下在 H5 播放时,遇到的兼容性问题,并封装一个 Vide ...
- Python 潮流周刊第 43 期(摘要),赠书 5 本《Python数据结构与算法分析(第3版)》
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- centos7上单机安装fastdfs6.0.9
目录 1.背景 2.fastdfs的一些知识 2.1 fastdfs的特点 2.2 架构图 2.2.1 client 介绍 2.2.2 tracker-server 介绍 2.2.3 storage- ...
- KingbaseES V8R6集群运维案例--主库PITR恢复后备库无法连接到集群
案例说明: KingbaseES V8R6集群,在主库执行PITR恢复后,clone备库:但是启动集群后,备库无法连接到主库,流复制状态和集群节点状态异常. 适用版本: KingbaseES V8R6 ...
- KingbaseES 服务器运行参数配置
Kingbase 服务器运行参数配置 说明: KingbaseES 数据库中,服务器运行参数配和需改有多种方式和注意事项,根据不同的分类配置,修改配置方式不同.关于服务器参数分类请参照[Kingbas ...