力扣每日一题小记(385. 迷你语法分析器)

题目与示例

题目
题目内容
给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。
列表中的每个元素只可能是整数或整数嵌套列表
来源:力扣(LeetCode)

示例 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



一、思路

对于整个列表有两种情况.
第一种情况是:列表中只有一个元素,是一个整数,这时候s[0]不为‘[’,我们只需要直接返回这个整数即可;
第二种情况是:列表中是整数嵌套列表,我们使用栈来解决这个问题.
对于嵌套列表中的元素,有4种情况,如果s[i]为’[‘,说明会有一个新被嵌套的数、如果s[i]为’-‘,说明这个数是负数,将flag设为-1、如果是s[i]为’,‘或’]',说明这个被嵌套的数已经读取完了、如果是一个数字,说明正在读取这个数字的元素,我们进行分类讨论.
每当我们读取完一个整数,就将NestedInteger实例向栈中压入,这样来实现嵌套,最后我们只需要返回栈S的栈顶元素即可。

二、解题代码

解题代码如下:

class Solution {
public:
    NestedInteger deserialize(string s) {
        if(s[0] != '['){
            return NestedInteger(stoi(s));
        }//如果s[0]不是'[',说明NestedInteger中就是一个数,直接返回这个数即可
        stack<NestedInteger> S;
        int num = 0 , flag = 1;//flag用于标识NestedInteger里的数是正还是负
        for(int i = 0; i < s.size(); i++) {
            if(s[i] == '[')//如果s[i]为'[',说明会有一个新被嵌套的数
                S.push(NestedInteger());//使用构造函数新建一个NestedInteger实例压入栈中
            else if(s[i] == '-')//如果s[i]为'-',说明这个数是负数,将flag设为-1
                flag = -1;
            else if(isdigit(s[i]))//isdigit()函数可以判断s[i]是不是一个十进制的数
                num = s[i] - '0' + 10 * num;//计算被嵌套的数字num
            else if(s[i] == ',' || s[i] == ']') {//如果是s[i]为','或']',说明这个被嵌套的数已经读取完了
                if(isdigit(s[i-1])) {//如果前面确实有一个数
                    num *= flag;//计算num的值
                    S.top().add(NestedInteger(num));//创建一个值为num的NestedInteger实例并让栈顶元素add
                }
                flag = 1;
                num = 0;//重置flag和num
                if(s[i]==']' && S.size()>1) {
                    NestedInteger NeI = S.top();
                    S.pop();
                    S.top().add(NeI);
                }
            }
        }
        return S.top();
    }
};
/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * class NestedInteger {
 *   public:
 *     // Constructor initializes an empty nested list.
 *     NestedInteger();
 *
 *     // Constructor initializes a single integer.
 *     NestedInteger(int value);
 *
 *     // Return true if this NestedInteger holds a single integer, rather than a nested list.
 *     bool isInteger() const;
 *
 *     // Return the single integer that this NestedInteger holds, if it holds a single integer
 *     // The result is undefined if this NestedInteger holds a nested list
 *     int getInteger() const;
 *
 *     // Set this NestedInteger to hold a single integer.
 *     void setInteger(int value);
 *
 *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 *     void add(const NestedInteger &ni);
 *
 *     // Return the nested list that this NestedInteger holds, if it holds a nested list
 *     // The result is undefined if this NestedInteger holds a single integer
 *     const vector<NestedInteger> &getList() const;
 * };
 */

注:以上部分内容源自力扣,解题方法为个人想法,如有错误还请大家指正

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值