首页 > 其他分享 >LeetCode_0224. 基本计算器,带括号和空格的加减法算式

LeetCode_0224. 基本计算器,带括号和空格的加减法算式

时间:2024-09-12 12:36:42浏览次数:10  
标签:标志 符号 算式 扫描 0224 变号 括号 int LeetCode

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

  • 示例 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 表示一个有效的表达式
    '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
    '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
    输入中不存在两个连续的操作符
    每个数字和运行的计算将适合于一个有符号的 32位 整数

分析

本题中只含有加减法,因此优先级只需要考虑括号。但,比起层层计算括号内的算式,不如直接去掉括号顺序计算更快。
去括号要考虑什么呢? 正负号。
若'('前符号为+,则去括号后,括号内加数的符号不变;反之加数变号。
遇到')'结束这个括号,变号标志就退回到'('前。
————>存本括号对应的变号标志

扫描字符串的策略

  • 空格:跳过
  • 数字:连续扫描得到这个数,最后数字乘以变号标志和当前符号
  • 扫描到'+':当前符号不变
  • 扫描到'-':当前符号变号
  • 扫描到'(':当前符号入栈为变号标志
  • 扫描到')':变号标志退栈

代码

    class Solution {
    public:
        int calculate(string s) {
            const int sLen = s.length();
            // 变号标志的栈,1表示不变号,-1表示变号
            stack<int> signsStack;
            signsStack.emplace(1);
            // 当前数的前序符号,变号标志栈的栈顶。一个数字的最终符号是二者乘积
            int currentSign = 1, topSign = 1;
            // 结果求和
            int ans = 0;

            // 遍历算式
            int p = 0;
            while(p < sLen) {
                // 跳过空格
                if(s[p] == ' ') {
                    ++p;
                    continue;
                }
                // 连续扫描数字,数字的最终符号是当前符号和变号标志的乘积
                if(s[p] >= '0' && s[p] <= '9') {
                    long num = 0;
                    while(p < sLen && s[p] >= '0' && s[p] <= '9') {
                        num = num * 10 + s[p] - '0';
                        ++p;
                    }
                    ans += currentSign * topSign * num;
                } else {
                    // 遇'(',变号情况压栈,当前符号归位1
                    if(s[p] == '(') {
                        signsStack.emplace(currentSign * topSign);
                        topSign = signsStack.top();
                        currentSign = 1;
                    // 遇')',回退到上一个状态
                    } else if(s[p] == ')') {
                        currentSign = signsStack.top();
                        signsStack.pop();
                        topSign = signsStack.top();
                    // 遇'+'或'-',更新当前符号
                    } else if(s[p] == '+'){
                        currentSign = 1;
                    } else if(s[p] == '-') {
                        currentSign = -1;
                    }
                    ++p;
                }
            }
            return ans;
        }
    };

标签:标志,符号,算式,扫描,0224,变号,括号,int,LeetCode
From: https://www.cnblogs.com/GaogaoBlog/p/18409941

相关文章

  • SQL.LeetCode(1321)餐馆营业额变化增长
    表: Customer+---------------+---------+|ColumnName|Type|+---------------+---------+|customer_id|int||name|varchar||visited_on|date||amount|int|+---------------+---------+在SQL中,(customer......
  • 爬楼梯(LeetCode)&冒泡和选择排序
    目录一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序......
  • LeetCode Hot100刷题记录-142. 环形链表 II
    给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是......
  • leetcode刷题day13|二叉树Part01(递归遍历、迭代遍历、统一迭代、层序遍历)
    递归遍历思路:使用递归的方式比较简单。1、递归函数的传参:因为最后输出一个数组,所以需要传入根节点和一个容器,本来想写数组,但发现长度不能确定,所以选择list。2、终止条件:当访问的节点为空时,return3、递归函数的逻辑:先访问一个节点,递归访问其他节点144.二叉树的前序遍历......
  • leetcode刷题day14|二叉树Part02(以递归方法为主:226.翻转二叉树、101. 对称二叉树、104
    226.翻转二叉树思路:利用先序遍历递归翻转1、终止条件:节点为空,return2、参数:root3、递归函数逻辑:处理中间节点,交换;递归左孩子,递归右孩子代码如下:classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnroot;swapC......
  • Day13 二叉树part03| LeetCode 110.平衡二叉树,二叉树的所有路径,左叶子之和,完全二叉树
    110.平衡二叉树110.平衡二叉树定义:左右子树的高度差的绝对值不超过1深度:从上到下查——>前序遍历(中左右)高度:从下到上查——>后序遍历(左右中)classSolution{publicbooleanisBalanced(TreeNoderoot){if(getHeight(root)==-1)......
  • LeetCode算法—滑动窗口
    一:滑动窗口1、窗口:滑动窗口的核心就是一个窗口;通常使用两个指针表示(一个指向左边界;一个指向右边界);窗口中的元素就是当前字串2、滑动:窗口从数组或字符串的起始位置开始,逐步向右滑动。当窗口无法满足条件时,调整左边界以缩小窗口;当窗口满足条件时,尝试记录当前窗口的结果,并继续调整......
  • LeetCode 977.有序数组的平方 (java)
    给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100],排序后,数组变为[0,1,9,16,100]示例2:输入:nums=[-7,-3,2,3,11]输出:[4,9,9,......
  • LeetCode 704.二分查找 (java)
    给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例 2:......
  • Leetcode 2453. Destroy Sequential Targets | rust 实现
    题解问题描述给定一个整数数组nums和一个整数space,我们需要找到一个目标值,使得该目标值在nums中的出现次数最多。如果有多个目标值出现次数相同,则返回最小的目标值。解题思路哈希表统计:使用哈希表map来统计每个seed%space的出现次数,题干中给出的等式等价为nums[n......