【LeetCode】224. 基本计算器 Basic Calculator(C++)


题目来源:https://leetcode-cn.com/problems/basic-calculator/

题目描述

实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。

示例 1:

输入:s = “1 + 1”
输出:2
示例 2:

输入:s = " 2-1 + 2 "
输出:3
示例 3:

输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23

提示:

1 <= s.length <= 3 * 105
s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成
s 表示一个有效的表达式

题目大意

  • 缩短遍历次数的最好办法,就是在遍历的时候对数据就进行处理,因为字符是单个依次读取,所以涉及到连续整数的合并,利用while特性,对满足条件下的i疯狂自增,可以缩短不少的时间
  • 维护一个nums栈,nums栈中只会存在1或-1,该栈主要用来保存当遇到括号时,对符号进行临时保存,1则当前数字是正数,-1则当前数字是负数

typedef long long ll;
class Solution {
    
    
public:
    int calculate(string s) {
    
    
        stack<int> nums;
        int ret = 0, i = 0, len = s.size();
        int sign = 1;
        // stack<int> nums作为符号位,一开始默认为+1
        nums.push(1);
        while (i < len){
    
    
            if (s[i] == ' ')
                ++i;
            else if(s[i] == '+'){
    
    
                sign = nums.top();
                ++i;
            }
            else if(s[i] == '-'){
    
    
                sign = -1 * nums.top();
                ++i;
            }
            else if(s[i] == '('){
    
    
                nums.push(sign);
                ++i;
            }
            else if(s[i] == ')'){
    
    
                nums.pop();
                ++i;
            }
            else{
    
    
                ll num = 0;
                while(i < len && s[i] >= '0' && s[i] <= '9'){
    
    
                    num = num * 10 + s[i] - '0';
                    ++i;
                }
                ret += sign * num;
            }
        }

        return ret;
    }
};
  • 官方的题解时间还是比我自个做出来的短啊(感叹)
    在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n)。n为数组的长度
  • 空间复杂度:O(n)。n为数组的长度

猜你喜欢

转载自blog.csdn.net/lr_shadow/article/details/114637837