前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[Leetcode 2021 刷题计划] 224. 基本计算器

[Leetcode 2021 刷题计划] 224. 基本计算器

原创
作者头像
windism
修改于 2021-03-11 01:44:29
修改于 2021-03-11 01:44:29
2910
举报
文章被收录于专栏:风扬风扬

每日一题时间: 2020-03-10 题目链接: 224. 基本计算器 官方题解链接: 基本计算器

题目

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

代码语言:txt
AI代码解释
复制
示例 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 表示一个有效的表达式

解题方法

当看到题目和难度以为会有加减乘除和括号等,原本想要用分治法来解决。对括号进行分割成一个个子串。

由于只含有加减法和括号, 并不需要考虑运算优先级的问题,仅有由于括号外符号对括号内符号的影响。所以只需要考虑括号外符号对括号内符号的反转。

代码语言:txt
AI代码解释
复制
class Solution {
public:
    int calculate(string s) {
        stack<int> ops;
        ops.push(1);
        // 可能会产生用例边界
        // 例如 A + B - C < INT_MAX 
        // 但 A + B > INT_MAX
        long res = 0;
        int i = 0, N = s.size(), sign = 1;
        while (i < N) {
            if (s[i] == ' ') {
                i++;
            } else if (s[i] == '+') {
                sign = ops.top();
                i++;
            } else if (s[i] == '-') {
                sign = -ops.top();
                i++;
            } else if (s[i] == '(') {
                ops.push(sign);
                i++;
            } else if (s[i] == ')') {
                ops.pop();
                i++;
            } else {
                long num = 0;
                while (i < N && s[i] >= '0' && s[i] <= '9') {
                    num = num * 10 + s[i] - '0';
                    i++;
                }
                res += sign * num;
            }
        }
        return res;
    }
};
  • 复杂度分析
    • 时间复杂度:O(N)
    • 空间复杂度: O(N)

参考资料

  1. 224. 基本计算器
  2. 基本计算器

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 解题方法
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档