leetcode 385 Mini Parser

2 篇文章 0 订阅

C++ Clean and Elegant Code with Clear logic

class Solution {
    NestedInteger parse(const string &s, int & pos)
    {
        if (s[pos] == '[')
            return parseList(s, pos);
        return parseNum(s, pos);
    }
    NestedInteger parseNum(const string &s, int & pos)
    {
        int num = 0;
        int sign = s[pos] == '-' ? -1 : 1;
        if (s[pos] == '-' || s[pos] == '+')
            pos ++;
        for (;pos < s.size() && isdigit(s[pos]); pos ++)
            num = num * 10 + s[pos] - '0';
        return NestedInteger(sign * num);
    }
    NestedInteger parseList(const string &s, int &pos)
    {
        NestedInteger ni;
        while (s[pos] != ']')
        {
            pos ++;                   //skip [ or ,
            if (s[pos] == ']') break; //handle [] or [1,2,]
            ni.add(parse(s, pos));
        }
        pos ++;                       // skip ]
        return ni;
    }
public:
    NestedInteger deserialize(const string &s) {
        int pos = 0;//pos ALWAYS points to 1 position past the last parsed string;
                    //This is an invariance maintained across the entire program.
        return parse(s, pos);
    }
};

stack 版本

class Solution {
public:
    NestedInteger deserialize(string s) {
        int i = 0;
        if (isdigit(s[i]) || s[i] == '-')
            return NestedInteger(stoi(s));
        ++i;
        NestedInteger list;
        while (s[i] != ']') {
            list.add(deserialize(s.substr(i, s.size() - i)));
            if(isdigit(s[i]) || s[i] == '-') {
                while(isdigit(s[i]) || s[i] == '-')
                    ++i;
            }else {
                i += num.top();
                num.pop();
            }

            if (s[i] == ',')
                ++i;
        }
        ++i;
        num.push(i);
        return list;
    }
private:
    stack<int> num;
};

以及牛b的istringstream
http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html
详解

class Solution {
public:
    NestedInteger deserialize(string s) {
        istringstream in(s);
        return deserialize1(in);
    }

private:
    NestedInteger deserialize1(istringstream &in) {
        int number;
        if (in >> number)
            return NestedInteger(number);
        in.clear();
        in.get();
        NestedInteger list;
        while (in.peek() != ']') {
            list.add(deserialize1(in));
            if (in.peek() == ',')
                in.get();
        }
        in.get();
        return list;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值