idea:刚开始是打算分类讨论,建立了数字栈和字符栈,按照传入字符当时两个栈的基本情况分类,结果讨论完之后分类太麻烦,导致分析完了之后漏洞不少。我觉得这道题难点在于括号和负号的处理,一开始将导致计算机出错的情况当成了重点,所以思路错了。

idea:下面的题解是遇到一个数处理一个数,无论该数是在括号里边还是外边,都将其按照括号展开后的情况直接加或减进行处理。在这里编者运用了sign记录了每一个数前边的符号情况,并且考虑了连续数字在字符串中的处理,如12+14实际上是五个字符

题解:

class Solution {
public:
    int calculate(string s) {
         stack<int> ops;  //建立栈,仅用来储存当前位置的数字在括号展开后的实际符号情况
        ops.push(1);    //基础符号默认为+
        int sign = 1;     //默认为+
        int ret = 0;    //当前得数
        int n = s.length();  
        int i = 0;
        while (i < n) {
            if (s[i] == ' ') {
                i++;
            } else if (s[i] == '+') {  
                sign = ops.top();    //“+”对sign值不产生影响
                i++;
            } else if (s[i] == '-') {  
                sign = -ops.top();  //“-”要变号
                i++;
            } else if (s[i] == '(') {
                ops.push(sign);    //遇到左括号将当前基础符号压入栈,即如果括号前是“-”,将“-1”入栈,在括号里边遇到“-”时sign为“+1”,遇到“+”是sign为“-1”。括号前是“+”,则与主式基础符号相同
                i++;
            } else if (s[i] == ')') {    //遇到右括号说明括号结束,将括号中的基础符号弹出栈
                ops.pop();
                i++;
            } else {          //遇到数字则开始计算
                long num = 0;      //计算当前遇到的数字实际大小,例如连续遇到字符'3'和'5',实际上为35,则num记为int值35
                while (i < n && s[i] >= '0' && s[i] <= '9') {  //考虑遇到连续字符的情况,即参与运算的不一定都是个位数,在这里用一个循环继续遍历后续的数字字符
                    num = num * 10 + s[i] - '0';      //百位*100,十位*10,个位*1
                    i++;
                }
                ret += sign * num;           //根据sign值判断是加上当前数还是减去
            }
        }
        return ret;
    }
};

复杂度分析

时间复杂度:O(n)O(n),其中 nn 为字符串 ss 的长度。需要遍历字符串 ss 一次,计算表达式的值。

空间复杂度:O(n)O(n),其中 nn 为字符串 ss 的长度。空间复杂度主要取决于栈的空间,栈中的元素数量不超过 nn。

明天再看其他的题解,没想到一道题做到半夜两点,结果连答案都分析了好半天才看懂

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

LeetCode224 基本计算器的更多相关文章

  1. [Swift]LeetCode224. 基本计算器 | Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  2. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  3. 自己动手写计算器v1.1

    这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与 ...

  4. 自己动手写计算器v1.0

    今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...

  5. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  6. [LeetCode] Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  7. JS-自制提速小工具:开发页面时需要按比例计算宽高值的快速计算器

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...

  8. 由ArcMap属性字段自增引出字段计算器使用Python的技巧

    1.前言       前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...

  9. 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现

    前面的话 本文用面向对象的技术来实现一个简单的图形面积计算器 图形类 //rect.class.php <?php abstract class Shape{ public $name; abs ...

  10. tn文本分析语言(四) 实现自然语言计算器

    tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. github地址:https://github.com/ferventdes ...

随机推荐

  1. idea安装破解

    转 一般都会去官网下载,官网地址IntelliJ IDEA,官网上对于不同的操作系统(windows,macOS,Linux)都有两个版本可供下载 3|0安装 确认已经安装好了 JDK ,每个IDEA ...

  2. Zero-Shot Temporal Action Detection via Vision-Language Prompting概述

    1.针对的问题 现有的方法在推断时只能识别之前见过的类别,即训练时出现过的类别,而为每个感兴趣的类收集和注释大型训练集是昂贵的. 2.主要贡献 (1)研究了如何利用大量预训练的ViL模型进行未修剪视频 ...

  3. mysql数据库配置

    1.下载mysql数据库解压到自己存放的路径 2.解压之后配置环境变量 [此电脑]- [右键]-[属性]-[高级系统设置]-[环境变量]- [找到系统变量中的path]-[选中]-[编辑]- [新建] ...

  4. abap 自定义搜索帮助

    ABAP 选择屏幕 自定义搜索帮助 物料号为例 如图展示的物料,是不经过自定义搜索帮助处理的,如果我只需要物料描述和物料号,且只限定20开头的物料,就需要用到自定义搜索帮助了 当使用自定义帮助后 效果 ...

  5. Asp.Net Core中使用日志组件log4net

    我们在开发任何项目过程中,记录各种日志是太正常不过的事情.没有日志记录的项目,也不可能放心进入生产环境运行.因此日志的记录,是必须要做的. 在.NET开发中,log4net是个常用的日志组件.本文简单 ...

  6. Java流程控制之while循环详解

    while循环 while循环 do...while循环 for循环 在Java5中引入了一种主要用于数组的增强型for循环 while循环 while循环是最基本的循环,它的结构为 while(布尔 ...

  7. pymongo解决查询的时区相差8小时

    背景 最近需要到mongoDB中查询数据,但是发现返回的日期总是和实际时间差8小时.到数据库查询了一下看到时间的确是准确的,只是查询出来的比实际的少了8小时. 通过网上查找资料了解到默认时区是UTC, ...

  8. 5G工业网关在智能工厂的应用案例

    智能工厂是5G技术的重要应用场景之一.利用5G网络将生产设备无缝连接,并进一步打通设计.采购.仓储.物流等环节,使生产更加扁平化.定制化.智能化,从而构造一个面向未来的智能制造网络. 5G 作为最优的 ...

  9. 全局 使用 stylus 变量

    首先 安装 啦 npm i stylus stylus-loader -D 之后 使用全局变量 然后在组件中引用改变量  -->没有用! 原因还没有在build/utils.js文件 全局引入 ...

  10. Ajax同步和异步的区别,如何解决跨域的问题

    同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式),同步强调的是顺序性,谁先谁后,异步则不存在这种顺序性. 同步:浏览器访问服务器请求,用 ...