广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GoJava算法之迷你语法分析器示例详解
  • 134
分享到

GoJava算法之迷你语法分析器示例详解

2024-04-02 19:04:59 134人浏览 薄情痞子
摘要

目录迷你语法分析器方法一:深度优先遍历(Java)方法二:栈(Go)迷你语法分析器 给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 N

迷你语法分析器

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

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

  • 示例 1:

输入:s = "324",

输出:324

解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。

  • 示例 2:

输入:s = "[123,[456,[789]]]",

输出:[123,[456,[789]]]

解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:

一个 integer 包含值 123

一个包含两个元素的嵌套列表:

i. 一个 integer 包含值 456

ii. 一个包含一个元素的嵌套列表

a. 一个 integer 包含值 789  

提示:

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

方法一:深度优先遍历(Java)

根据题意,一个 NestedInteger 实例只能包含下列两部分之一:1)一个整数;2)一个列表。

列表中的每个元素都是一个 NestedInteger 实例。据此,NestedInteger 是通过递归定义的,因此也可以用递归的方式来解析。

注意序列化的String,有2个特殊含义,导致不能用String.split()。否则实现起来会比较困难。

逗号: 表示分割“同层级”的元素

中括号[] : 表示1个List,可以有兄弟节点Integer。

如果用逗号分割,可能会割裂了[]的List含义。

class Solution {
    int index = 0;
    public NestedInteger deserialize(String s) {
        if (s.charAt(index) == '[') {
            index++;
            NestedInteger ni = new NestedInteger();
            while (s.charAt(index) != ']') {
                ni.add(deserialize(s));
                if (s.charAt(index) == ',') {
                    index++;
                }
            }
            index++;
            return ni;
        } else {
            boolean negative = false;
            if (s.charAt(index) == '-') {
                negative = true;
                index++;
            }
            int num = 0;
            while (index < s.length() && Character.isDigit(s.charAt(index))) {
                num = num * 10 + s.charAt(index) - '0';
                index++;
            }
            if (negative) {
                num *= -1;
            }
            return new NestedInteger(num);
        }
    }
}

时间复杂度:O(n)

空间复杂度:O(n)

方法二:栈(Go)

我们只需关注字符串s中的[],字符,其他字符均可转为数字,初始化栈时,将一个空的NestedInteger加入其中,防止越界。

顺序遍历,3 种情况:

[ :新建列表,入栈

数字和-:累加字符串

],:字符串加完,加入列表

]出栈,结果加入上级列表

func deserialize(s string) *NestedInteger {
  if s[0] != '[' {
    integer, _ := strconv.Atoi(s)
    nestedInteger := &NestedInteger{}
    nestedInteger.SetInteger(integer)
    return nestedInteger
  }
  stack, integer := []*NestedInteger{}, ""
  for _, ch := range s {
    switch ch {
      case '[':
        stack = append(stack, &NestedInteger{}) // 入栈
      case ']':
        fallthrough
      case ',':
        if integer != "" {
          int, _ := strconv.Atoi(integer)
          nestedInteger := NestedInteger{}
          nestedInteger.SetInteger(int)
          stack[len(stack) - 1].Add(nestedInteger)
          integer = ""
        }
        if ch == ']' && len(stack) > 1 { // 出栈
          stack[len(stack) - 2].Add(*stack[len(stack) - 1])
          stack = stack[:len(stack) - 1]
        }
      default:
        integer += string(ch)
    }
  }
  return stack[len(stack) - 1]
}

时间复杂度:O(n)

空间复杂度:O(n)

以上就是Go Java 算法之迷你语法分析器示例详解的详细内容,更多关于Go Java 算法语法分析器的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: GoJava算法之迷你语法分析器示例详解

本文链接: https://www.lsjlt.com/news/165718.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • GoJava算法之迷你语法分析器示例详解
    目录迷你语法分析器方法一:深度优先遍历(Java)方法二:栈(Go)迷你语法分析器 给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 N...
    99+
    2022-11-13
  • GoJava算法之累加数示例详解
    目录累加数方法一:穷举法(java)方法二:深度优先遍历(go)累加数 累加数 是一个字符串,组成它的数字可以形成累加序列。 一个有效的 累加序列 必须 至少 包含 3 个数。除了最...
    99+
    2022-11-11
  • GoJava算法之找不同示例详解
    目录找不同方法一:计数(Java)方法二:求和(Go)找不同 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位...
    99+
    2022-11-13
  • Gojava算法之括号生成示例详解
    目录括号生成方法一:深度优先遍历(java)方法一:深度优先遍历(go)括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组...
    99+
    2022-11-11
  • GoJava算法之单词规律示例详解
    目录单词规律方法一:哈希表(Java)方法一:哈希表(GO)单词规律 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同...
    99+
    2022-11-11
  • GoJava算法之同构字符串示例详解
    目录同构字符串方法一:哈希表(Java)方法一:哈希表(Go)同构字符串 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 ...
    99+
    2022-11-11
  • GoJava算法之Excel表列名称示例详解
    目录Excel表列名称方法一:数学(Java)方法一:数学(Go)Excel表列名称 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 ...
    99+
    2022-11-11
  • GoJava算法之外观数列实现方法示例详解
    目录外观数列方法一:遍历生成(Java)方法二:递归(Go)外观数列 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都...
    99+
    2022-11-13
    Go Java算法外观数列 Go Java算法
  • GoJava算法之二叉树的所有路径示例详解
    目录二叉树的所有路径方法一:深度优先遍历搜索(Java)方法二:广度优先遍历(Go)二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的...
    99+
    2022-11-11
  • GoJava算法之从英文中重建数字示例详解
    目录从英文中重建数字Java实现Go实现从英文中重建数字 给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。 示例 1: 输入...
    99+
    2022-11-13
    Go Java算法英文重建数字 Go Java算法
  • PHP基本语法之比较运算符的示例分析
    这篇文章将为大家详细讲解有关PHP基本语法之比较运算符的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是PHP基本语法之比较运算符,为什么进行比较,他们之间有什么不一样的故事呢?本篇文章则会带...
    99+
    2023-06-15
  • Python机器学习之AdaBoost算法的示例分析
    这篇文章将为大家详细讲解有关Python机器学习之AdaBoost算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、算法概述AdaBoost 是英文 Adaptive Boosting(自适...
    99+
    2023-06-15
  • opencv3机器学习之EM算法示例详解
    目录引言一、opencv3.0中自带的例子二、trainEM实现自动聚类进行图片目标检测引言 不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注...
    99+
    2022-11-13
  • Python机器学习之PCA降维算法的示例分析
    小编给大家分享一下Python机器学习之PCA降维算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、算法概述主成分分析 (Principal Com...
    99+
    2023-06-15
  • 详解JavaScript实现简单的词法分析器示例
    目录正文什么是词法分析器?实现一个简单的词法分析器总结正文 词法分析是编译器的一项重要工作,其目的是将源代码转换成单个单词(token)的序列,方便后续语法分析器(parser)对...
    99+
    2023-03-10
    JavaScript词法分析器 JavaScript 分析器
  • C/C++语言八大排序算法之桶排序全过程示例详解
    基本思路是将所有数的个位十位百位一直到最大数的最高位一步步装桶,先个位装桶然后出桶,直到最高位入桶出桶完毕。 首先我们要求出一个数组的最大数然后求出他的最大位数  //...
    99+
    2022-11-12
  • ES6语法之可迭代协议和迭代器协议的示例分析
    这篇文章给大家分享的是有关ES6语法之可迭代协议和迭代器协议的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ECMAScript 2015的几个补充,并不是新的内置或语法...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作