每日一题——迷你语法分析器

简介: 每日一题——迷你语法分析器

385. 迷你语法分析器

题目描述:

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

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

解释:

后台实现了一个NestedInteger结构体,每一个NestedInteger实例有两种情况,数字和序列。

每一个序列可以包含序列和数字,而数字就是数字,不能包含序列。

默认是序列,如果要设置为数字通过setInteger函数实现。

比如[1, [2, 3], 4]这个NestedInteger的结构就是:

NestedInteger(序列):{

 NestedInteger(数字):1

 NestedInteger(序列):{

   NestedInteger(数字):2

   NestedInteger(数字):3

 }

 NestedInteger(数字):4

}

题解:

注意:

以下方法是题目自带的,不需要我们实现

type NestedInteger struct {}
// 如果这个NestedInteger保存单个整数,而不是嵌套的列表,则返回true
func (n NestedInteger) IsInteger() bool {}
// 如果它持有一个单个整数,返回这个NestedInteger持有的单个整数
// 如果这个NestedInteger持有一个嵌套的列表,结果是未定义的
// 所以在调用这个方法之前,你应该有一个检查
func (n NestedInteger) GetInteger() int {}
// 将这个NestedInteger设置为保存单个整数。
func (n *NestedInteger) SetInteger(value int) {}
// 设置这个NestedInteger来保存一个嵌套的列表,并向它添加一个嵌套的整数。
func (n *NestedInteger) Add(elem NestedInteger) {}
// 如果它持有一个嵌套列表,返回这个NestedInteger持有的嵌套列表
// 如果这个NestedInteger保存单个整数,则列表长度为0
// 如果你想修改NestedInteger的List元素,你可以直接访问它
func (n NestedInteger) GetList() []*NestedInteger {}
func deserialize(s string) *NestedInteger {
  // 如果首位不为'[' 说明只有一个数字,初始化一个序列,并设置为数字返回
  if s[0] != '[' {
    num, _ := strconv.Atoi(s)
    ni := &NestedInteger{}
    ni.SetInteger(num)
    return ni
  }
  stack:=[]*NestedInteger{}
  num:=0
  negative:=false
  for i, ch := range s {
    if ch == '-' {
      negative = true
    } else if unicode.IsDigit(ch) { // 判断是否为数字
      num = num*10 + int(ch-'0')
    } else if ch == '[' {
      stack = append(stack, &NestedInteger{})
    } else if ch == ',' || ch == ']' {
      if unicode.IsDigit(rune(s[i-1])) {
        if negative {
          num = -num
        }
        ni := NestedInteger{}
        ni.SetInteger(num)
        stack[len(stack)-1].Add(ni)
      }
      num, negative = 0, false
      if ch == ']' && len(stack) > 1 {
        stack[len(stack)-2].Add(*stack[len(stack)-1])
        stack = stack[:len(stack)-1]
      }
    }
  }
  return stack[len(stack)-1]
}
相关文章
【计算机基础】五笔字根分解图
【计算机基础】五笔字根分解图
59 0
|
14天前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
46 19
|
14天前
|
存储 编译器 C语言
【C语言程序设计——选择结构程序设计】求一元二次方程的根(头歌实践教学平台习题)【合集】
本任务要求根据求根公式计算并输出一元二次方程的两个实根,精确到小数点后两位。若方程无实根,则输出提示信息。主要内容包括: - **任务描述**:使用求根公式计算一元二次方程的实根。 - **相关知识**:掌握 `sqrt()` 函数的基本使用方法,判断方程是否有实根。 - **编程要求**:根据输入的系数,计算并输出方程的根或提示无实根。 - **测试说明**:提供两组测试数据及预期输出,确保代码正确性。 - **通关代码**:包含完整的 C 语言代码示例,实现上述功能。 通过本任务,你将学会如何处理一元二次方程的求解问题,并熟悉 `sqrt()` 函数的使用。
25 5
|
3月前
|
编译器 C#
总结C# 常用语法糖
总结C# 常用语法糖
56 2
|
C语言
写一个简单的背单词c语言程序
写一个简单的背单词c语言程序
92 0
|
自然语言处理 IDE 开发工具
【编译原理】第三章语法分析
【编译原理】第三章语法分析
|
算法 Cloud Native
【刷题日记】385. 迷你语法分析器
本次刷题日记的第 33 篇,力扣题为:【刷题日记】385. 迷你语法分析器 ,中等
|
移动开发 自然语言处理 算法
编译原理课设-设计一个词法分析器
编译原理课设-设计一个词法分析器
338 0
LeetCode每日一题——385. 迷你语法分析器
给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。
98 0
|
自然语言处理 C++
编译原理 词法分析实验/课程设计C++实现
词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务
编译原理 词法分析实验/课程设计C++实现