算法通关村第四关-黄金挑战基础计算器问题

news2024/12/28 4:46:33

大家好我是苏麟 , 今天带来栈的比较难的问题 .

计算器问题

基础计算器 LeetCode 224

描述 :

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

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

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

题目 :

LeetCode 224.基本计算器 : 

224. 基本计算器

分析 : 

计算器也是非常常见的问题,解决运算器问题,最好的工具就是栈。我们需要两个变量来记录符号和运算后的值 , 因为题目中只有 + - ( ) 和空格 , 所以我们遇到空格就跳过 , 遇到就把符号位变为1 , 遇到减号就把符号位变为 -1 , 遇到 ( 就把计算的值和符号放到栈里 , 遇到 ) 就把栈中的值和符号取出来和当前的数字相加 , 遇到数字就进行操作 ... ... 

当然这里说可能不太好理解 , 下面有个视频大家可以更好的理解这个思路 .

视频连接 : 基础计算器

解析 :

这个代码写的不是很华丽 , 但是是这个意思 ...

//LeetCode
class Solution {
    public int calculate(String s) {

    //0 + (1+(4+5+2)-3)+(6+8)

    Stack<Integer> stack = new Stack<>();
    int nums = 0;
    int flag = 1;
    int temp = 0;

    int n = 0;
    while( n < s.length()){
        char c = s.charAt(n);
        int d = c - '0';
        if(c == ' '){
            n++;
        }else if(c == '+'){
            flag = 1;
            n++;
        }else if(c == '-'){
            flag = -1;
            n++;
        }else if(c == '('){
            stack.push(nums);
            stack.push(flag);
            nums = 0;
            flag = 1;
            n++;
        }else if(c == ')'){
            int preFlag = stack.pop();
            int preNums = stack.pop();
            nums = nums * preFlag + preNums;
            n++;
        }else{
            temp = c - '0';
            n++;
            while(n < s.length() && s.charAt(n) >= '0' && s.charAt(n) <= '9'){
                char r = s.charAt(n);
                temp = 10 * temp +  (r - '0');
                n++;
            }
            nums = nums + temp * flag;
        }
    }
        return nums;
    }
}

基础计算器 LeetCode 227

描述 :

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

题目 :

LeetCode 227.基础计算器

227. 基本计算器 II

分析 :

解决运算器问题,最好的工具就是栈。由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值。

对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果具体来说,遍历字符串 ss,并用变量flag 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。每次遍历到数字末尾时,根据 flag 来决定计算方式 加号: 将数字压入栈,减号: 将数字的相反数压入栈,乘除号: 计算数字与栈顶元素,并将栈顶元素替换为计算结果。代码实现中,若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾。处理完该数字后,更新 flag  为当前遍历的字符遍历完字符串 ss 后,将栈中元素累加,即为该字符串表达式的值。

Character.isDigit() 这个函数是判断字符是否由数字组成

举例 : 2 * 5  s="2 * 5" s的长度=5

第一步 : num = 0 , flag = '+' , 遍历 i = 0 因为是数字所以 : num = 2 

第二步 :  遍历 i = 1 , ' ' 不会进入循环

第三部 : 遍历 i = 2 , * 是乘号 所以进入到第二个分支里 , 因为默认的flag = '+' , 所以把2放到栈里 , 把符号flag = * , num = 0

第四步 : 遍历 i = 3 , ' ' 不会进入分支

第五步 : 遍历 i = 4  , num = 5 并且 i = n 所以进入第二个分支 , flag = * , 所以取出 2 * num = 2 * 5 = 10 , 把10放到栈里

解析 :

class Solution {
    public int calculate(String s) {
        Stack<Integer> stack = new Stack<>();
        char flag = '+';
        int num = 0;
        int n = s.length() - 1;
        for(int i =0 ; i <= n ; i++){
            if(Character.isDigit(s.charAt(i))){
                num = num * 10 + (s.charAt(i) - '0');
            }
            if(!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n ){
                switch(flag){
                    case '+' :
                        stack.push(num);
                        break;
                    case '-' :
                        stack.push(-1 * num);  
                        break;
                    case '*' :
                        stack.push(stack.pop() * num);
                        break;
                    default :
                        stack.push(stack.pop() / num);
                }
                flag = s.charAt(i);
                num = 0;
            }
        }
        int val = 0;
        while(!stack.isEmpty()){
            val += stack.pop();
        }
        return val;
    }
}

这关就到这里 , 下一关见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1163342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩转硬件之Micro:bit的玩法(四)——声控灯

智能家居的普及在近几年来呈现出了爆发式的增长。随着科技的不断进步和人们对便利生活的追求&#xff0c;越来越多的家庭开始采用智能家居系统&#xff0c;使生活更加智能化、便捷化。 智能家居的普及不仅改变了人们的生活方式&#xff0c;也为家庭带来了更多的便利和舒适。现…

Betaflight 4.5 + Aocoda-RC F405V2 + AT32F435 Mark4 试飞初步总结

Betaflight 4.5 Aocoda-RC F405V2 AT32F435 Mark4 试飞初步总结 1. 源由2. 试飞3. 问题3.1 图传功率设置异常3.2 图传信号不理想3.3 ELRS915 信号差3.4 RSSI dbm告警3.5 翻滚不太顺手3.6 摄像头色彩异常3.7 磁力计指示方向异常 4. 参考资料 1. 源由 开销了一整天的时间&…

去除短视频平台水印 | 一键下载神器

当咱们这些视频创作者在短视频平台找素材的时候&#xff0c;经常会碰到下载下来居然带着平台水印的烦恼&#xff0c;这可让咱们的创作受到了限制和困扰不过别着急&#xff01;咱这就推荐几款超方便的短视频一键去水印下载工具&#xff0c;帮你快速去掉水印&#xff0c;轻松搞定…

第五章 基于视图的SysML模型|系统建模语言SysML实用指南学习

仅供个人学习记录 定制的机制在15.7节 定制语言部分阐述 仅记录个别值得专门记下来的概念 SysML视图 画布 图内容diagram context 也被称作画布canvas 省略号 显示省略号表示并非所有可视分区元素均显示 离页连接器 两节点之间的路径标识反映了节点所表示的两个模型元…

如何巧妙公布成绩

宝子们&#xff0c;来来来&#xff01;听说你们对如何公布学生成绩很头疼&#xff1f;别担心&#xff0c;今天就让我来给大家支支招&#xff01; 1在家长群内发公告&#xff0c;孩子的成绩已出&#xff0c;想知道具体成绩可以私信哦&#xff5e;简单粗暴&#xff01;关心孩子的…

会stm32有机会进大公司吗?

今日话题&#xff0c;会stm32有机会进大公司吗&#xff1f;我本科期间参与了飞思卡尔和电赛等比赛&#xff0c;使用过多种单片机&#xff0c;但渐渐发现单片机只是其中的一小部分。不要过分迷恋所谓的单片机基础和技巧&#xff0c;更值得深入研究的是C语言。如果你对此感兴趣&a…

【C++入门 三】学习C++缺省参数 | 函数重载 | 引用

C入门 三 1.缺省参数1.1 缺省参数概念1.2 缺省参数分类 2. 函数重载2.1 函数重载概念2.2 C支持函数重载的原理--名字修饰(name Mangling) 3.引用3.1引用概念3.2引用特性3.3 常引用3.4 使用场景1. 做参数2. 做返回值 3.5 传值、传引用效率比较3.6引用和指针的区别 4.引用和指针的…

Qt PingFang字体在Debian/Ubuntu上安装

1 下载ttf格式的字体库 2 将上图中的ttf文件拷贝到/usr/share/fonts/truetype 3 执行 fc-cache -f -v 4 如果qt程序字体效果未显示&#xff0c;可能与qt的字体路径有关 我这边是这样修改的&#xff1a;

使用 C# 在Word中插入图表

Word中的图表功能将数据可视化地呈现在文档中。这为展示数据和进行数据分析提供了一种方便且易于使用的工具&#xff0c;使作者能够以直观的方式传达信息。要通过C#代码来实现在Word中绘制图表&#xff0c;可以借助 Spire.Doc for .NET 控件&#xff0c;具体操作参考下文。 目录…

Qt QSystemTrayIcon实现系统托盘

1.简介 QSystemTrayIcon是Qt中的一个类&#xff0c;用于创建和管理系统托盘图标。系统托盘图标是显示在操作系统任务栏或通知区域的小图标&#xff0c;它可以用来在后台运行的应用程序中提供快速访问功能。 2.常用方法 设置托盘的显示图标 setIcon(const QIcon &icon) …

Python 文件处理:完整指南,一文够了

Python 是一种流行的解释型动态类型编程语言&#xff0c;用于构建 Web 服务、桌面应用程序、自动化脚本和机器学习项目。程序员在使用基于 Python 的软件项目时&#xff0c;通常必须访问操作系统的文件系统。 例如&#xff0c;我们使用文本文件作为输入&#xff0c;编写文本文…

用了这款插件,零代码基础也能写代码你信吗?

写在前面 使用过chatGPT的同学&#xff0c;可能都会有过这样的经历&#xff1f;遇到代码不会的问题&#xff0c;本能的就去求助chatGPT&#xff0c;然后并根据chatGPT的回答去优化代码。但是&#xff0c;没了梯子的话&#xff0c;chatGPT是不是也帮不上忙了&#xff1f;还是只…

课程学习前言

App逆向说明 app抓包分析可以看到有签名有加固&#xff0c;毕竟需要APK去访问服务、获取数据&#xff0c;都需要APK有完整的信息&#xff0c;而这些信息、代码经过各种加密&#xff0c;还是放在APK里面。说白了&#xff0c;就是门锁紧了&#xff0c;钥匙藏在门口某个地方&…

英语语法,时态总结,16种时态

文章目录 前言总体说明过去时一般过去时过去进行时过去完成时过去完成进行时 现在时一般现在时现在进行时现在完成时现在完成进行时 将来时一般将来时将来进行时将来完成时将来完成进行时 过去将来时一般过去将来时过去将来进行时过去将来完成时过去将来完成进行时 前言 学了这…

零日漏洞预防

零日漏洞&#xff0c;是软件应用程序或操作系统&#xff08;OS&#xff09;中的意外安全漏洞&#xff0c;负责修复该漏洞的一方或供应商不知道该漏洞&#xff0c;它们仍然未被披露和修补&#xff0c;为攻击者留下了漏洞&#xff0c;而公众仍然没有意识到风险。 零日攻击是如何…

项目上线前发现严重Bug怎么办?

今天分享一个面试问题&#xff0c;现在有一个面试场景&#xff1a; 项目计划明天发布&#xff0c;但是在今天你作为测试人员发现了一个严重的bug&#xff0c;市场相关人员又在催发布的事情&#xff0c;这个时候你应该怎么办&#xff1f; 这是测试工程师不管是在面试&#xff0…

【计算机组成原理】CPU的工作原理

一.CPU的组成结构 CPU主要有运算器、控制器、寄存器和内部总线等组成&#xff0c;其大概的样子长这样&#xff1a; 看不懂没关系&#xff0c;我们将采用自顶而下的方法来讲解CPU的具体工作原理&#xff0c;我们首先来说一下什么叫寄存器&#xff0c;顾名思义&#xff0c;寄存器…

同等学力申硕就一个硕士学位,这有什么用?

很多想在职考研的同学报名前都会拿不定主意选哪种方式好。 想考非全日制研究生吧&#xff01;又怕难&#xff0c;卷不过在校生。 选同等学力吧&#xff0c;就一个研究生硕士学位&#xff0c;学历层次还是本科&#xff0c;用处不大。 其他的国际硕士学费又太贵&#xff0c;负…

Linux 安装 Redis7.x

Linux 安装 Redis7.x 下载redis7检查linux版本检查是否有 gcc什么是 gcc查看 gcc 是否有安装 安装 redis7查看默认安装目录启动服务连接服务服务关闭Redis的删除卸载Redis数据类型 下载redis7 下载地址&#xff1a;https://download.redis.io/releases/ 检查linux版本 [root…

Jmeter 的 jar 包开发环境搭建,看这一篇就够了!

1、JDK环境变量配置 JAVA_HOMEE:\Program Files\Java\jdk1.8.0_102 Path%JAVA_HOME%\bin; CLASSPATH.;%JAVA_HOME%\lib\dt.jar;.;%JAVA_HOME%\lib\tools.jar 验证环境变量有没有生效&#xff1a;看到如下信息说明 JDK 环境变量已经生效 2、配置 maven 环境 1、下载地址&am…