华为OD机试真题(Java),四则运算(100%通过+复盘思路)

news2024/11/23 9:09:52

一、题目描述

输入一个表达式(用字符串表示),求这个表达式的值。

保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

数据范围:表达式计算结果和过程中满足∣val∣≤1000 ,字符串长度满足 1≤n≤1000

二、输入描述

输入一个算术表达式。

三、输出描述

得到计算结果。

四、解题思路

  1. 读取输入的算术表达式字符串 s;
  2. 初始化变量 num1 为0,用于保存当前运算结果;
  3. 初始化变量 o1 为1,表示当前运算符的符号,默认为正号;
  4. 初始化变量 num2 为1,用于保存当前数字的值;
  5. 初始化变量 o2 为1,表示当前乘除运算符的符号,默认为正号;
  6. 创建一个栈 stk,用于保存计算过程中的状态;
  7. 遍历表达式字符串 s的每个字符 c:
    • 若 c 是数字字符,则将连续的数字字符解析成一个整数 cur,并根据 o2 的符号进行乘除运算,更新 num2 的值;
    • 若 c 是乘除运算符字符 * 或 /,更新 o2 的符号;
    • 若 c 是左括号字符 ( 或 { 或 [,将当前的运算结果和运算符状态压入栈中,并初始化 num1、o1、num2、o2 的值;
    • 若 c 是加减运算符字符 + 或 -,表示可以开始计算结果了,根据 o1 的符号将当前的 num2 加或减到 num1 上,并更新 o1 和 o2 的值,重新初始化 num2 为1;
    • 若 c 是右括号字符 ) 或 } 或 ],表示一个括号内的表达式结束,从栈中弹出之前保存的运算状态,并根据弹出的状态重新计算 num2 的值;
  8. 计算结束后,输出最终结果 num1 + o1 * num2;

五、Java算法源码

public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();
    int n = s.length();
    int num1 = 0;
    int o1 = 1;
    int num2 = 1;
    int o2 = 1;
    Stack<Integer> stk = new Stack<>();

    for(int i=0; i<n; i++){
        char c = s.charAt(i);
        if(Character.isDigit(c)){  //遇到数字则定义num2
            int cur = 0;
            while(i<n && Character.isDigit(s.charAt(i))){
                cur = cur * 10 + (s.charAt(i) - '0');
                i++;
            }
            i--;
            num2 = o2 == 1 ? num2 * cur : num2 / cur;
        }else if(c=='*' || c=='/'){  //遇到×÷定义o2
            o2 = c == '*' ? 1 : -1;
        }else if(c == '(' || c=='{' || c=='['){  //遇到括号则保存当前结果,并初始化
            stk.push(num1);
            stk.push(o1);
            stk.push(num2);
            stk.push(o2);

            num1 = 0;
            o1 = 1;
            num2 = 1;
            o2 = 1;
        }else if(c == '+' || c=='-'){  //遇到加减,说明可以开始计算,计算num1并对定义其他几个变量
            if(c=='-' && (i==0 || s.charAt(i-1)=='(' || s.charAt(i-1)=='[' || s.charAt(i-1)=='{')){
                o1 = -1;
                continue;
            }
            num1 = num1 + o1 * num2;
            o1 = (c == '+' ? 1 : -1);
            num2 = 1;
            o2 = 1;
        }else{  //遇到右括号,则出栈,并计算num2
            int cur = num1 + o1 * num2;
            o2 = stk.pop();
            num2 = stk.pop();
            o1 = stk.pop();
            num1 = stk.pop();

            num2 = o2 == 1 ? num2 * cur : num2 / cur;
        }
    }
    System.out.println(num1 + o1 * num2);
}

六、效果展示

在这里插入图片描述

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

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

相关文章

gitlab记录

1、docker方式部署启动 参考文档&#xff1a; https://blog.csdn.net/weixin_53443677/article/details/125518696 https://blog.csdn.net/weixin_39034012/article/details/119211630 1.1、docker启动gitlab 前期准备 > # 拉镜像 > docker pull gitlab/gitlab-ce:late…

chatgpt赋能python:Python代码30行:提高网站SEO的最佳实践

Python 代码 30 行&#xff1a;提高网站 SEO 的最佳实践 搜索引擎优化&#xff08;SEO&#xff09;是网站成功的重要因素&#xff0c;它可以让网站排名更高并吸引更多的流量。Python 代码可以帮助您实现最佳的 SEO 实践&#xff0c;并提高网站的可见性和排名。下面是一个包含 …

Tugraph的设计和源码初步解析

1. Tugraph Tugraph是一款开源的性能优秀的图数据库&#xff0c;该图数据库使用多版本的BTree作为数据的存储引擎&#xff0c;同时设置了点边数据在这个存储引擎上的布局&#xff08;主要考虑数据的局部性&#xff09;&#xff0c;从而达到高性能查询的目的。本文主要从Tugrap…

ubuntu系统登录密码重置方法

公司搬家&#xff0c;需要更改git服务器地址&#xff0c;发现服务器密码也忘记了&#xff0c;折腾了下&#xff0c;通过如下方法修改成功。 一、重启计算机并进入GRUB菜单&#xff08;如果您的计算机没有显示GRUB菜单&#xff0c;请尝试按住Shift键或Esc键&#xff0c;直到出现…

手机安卓Termux搭建Hexo博客网站,并发布公网访问。

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章&#xff1a;安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…

DAY04_JDBC快速入门JDBC API详解SQL防注入数据库连接池JDBC综合练习

目录 1 JDBC1.1 JDBC概念1.2 JDBC本质 1.3 JDBC好处 2 JDBC快速入门2.1 编写代码步骤2.2 具体操作 3 JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行对象3.2.2 事务管理 3.3 Statement3.4 ResultSet3.4.1 ResultSet案例 3.5 PreparedStatement3.5.1 SQL注入3.5.2 …

基于opencv实现两路yuv数据拼接合成一张大图

背景 实时音视频通话&#xff08;RTC&#xff09;越来越注重安全审核&#xff0c;特别是在1v1娱乐社交场景中&#xff0c;对于视频反垃圾的需求也越来越大。随之而来的是客户对审核成本降低的诉求日益强烈。针对1v1场景&#xff0c;将两路视频拼接成一张图片进行审核相比于分别…

大数据Doris(三十一):Broker Load导入HDFS json格式数据和注意事项

文章目录 Broker Load导入HDFS json格式数据和注意事项 一、导入HDFS json格式数据 1、创建Doris表

nginx(八十一)rewrite模块指令再探之(三)重定向

一 return和rewrite重定向再探 ① 前言 多种重定向跳转方式的差异 nginx与Location响应头细节探讨 本为不涉及讨论如下的绝对重定向1) return 301 http://www.wzj.com:6443/url?namewzj2) rewrite ... http://www.wzj.com:6443/url 2) rewrite ... http://www.wzj.com:64…

一分钟学一个 Linux 命令 - pwd

前言 大家好&#xff0c;我是 god23bin。欢迎大家继续围观《一分钟学一个 Linux 命令》&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。本篇文章将聚焦于 pwd 命令&#xff0c;一个超级简单又常用的命令。在接下来的内容中&#xff0c;我将快速介绍 pwd…

Elasticsearch总结

详细描述一下 Elasticsearch 搜索的过程&#xff1f; 1、搜索被执行成一个两阶段过程&#xff0c;我们称之为 Query Then Fetch&#xff1b; 2、在初始查询阶段时&#xff0c;查询会广播到索引中每一个分片拷贝&#xff08;主分片或者副本分片&#xff09;。 每个分片在本地执…

chatgpt赋能python:使用Python关闭所有子进程

使用Python关闭所有子进程 如果您使用Python编写了多进程应用程序&#xff0c;那么您可能会遇到一些关闭所有子进程的问题。这种情况可能是您的主进程已经完成了&#xff0c;但是子进程却没有关闭&#xff0c;从而导致资源浪费和程序崩溃。在这篇文章中&#xff0c;我们将讨论…

STM32F1xx -- Systick 系统滴答定时器

1. SysTick 是一个向 CPU 提供定时中断信号的计数器&#xff0c;其计数速率是由 Cortex-M 系列处理器的系统时钟频率和 SysTick 计数器的重载值共同决定的。 1.1 Systick 时钟来源之一&#xff0c;Systick 一般设置为1ms 中断一次&#xff0c;为系统任务调度提供服务&#xff…

R语言:集卡活动概率测算模拟

背景&#xff1a;以支付宝集五福活动为代表的集卡类营销活动背后&#xff0c;每张卡出现的概率测算是非常重要的&#xff0c;假设我们可以预估有多少人参与活动以及大致每人能抽多少次&#xff0c;且限定一共有多少人能够集齐&#xff0c;在这些限定条件下&#xff0c;每张卡出…

CentOS 系统上安装 Jenkins

#######################注意我这里安装jenkins版本要求实际是要安装jdk11版本的~~~我一开始弄错了 您可以按照以下步骤在 CentOS 上安装 JDK&#xff1a; 1. 首先&#xff0c;打开终端并使用 yum 命令更新系统软件包列表。输入以下命令来执行此操作&#xff1a; sudo yu…

chatgpt赋能python:Python为什么闪退?

Python为什么闪退&#xff1f; Python作为一种高级编程语言&#xff0c;已经赢得了世界各地许多开发者的青睐。但是&#xff0c;有时候Python会因为各种原因而突然闪退&#xff0c;给开发者带来极大的困扰。那么&#xff0c;Python为什么会闪退呢&#xff1f; 1. 内存泄漏 内…

环境感知算法——2.CenterNet基于KITTI数据集训练

1. CenterNet简介 CenterNet采用了一种新的检测思路&#xff0c;即以目标中心点为基础&#xff0c;直接回归出目标的位置和大小。而传统的目标检测算法通常会先产生大量候选框&#xff08;Anchor&#xff09;&#xff0c;再通过分类器进行筛选&#xff0c;这种方法比较复杂。C…

selenium浏览器自动化测试

Selenium是一个用于Web应用程序的自动化测试工具。它直接运行在浏览器中&#xff0c;可以模拟用户在浏览器上面的行为操作。 Selenium入门 下载驱动 查看谷歌浏览器版本 谷歌浏览器输入网址的地方输入&#xff1a;chrome://version 下载与浏览器对应&#xff08;或相近&#x…

RK3588平台开发系列讲解(驱动基础篇)驱动模块传参

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、驱动模块传参简介二、驱动模块传普通参数三、驱动模块传数组沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在编写应用程序的时候,我们可以给 main 函数传递参数,比如 void main(int argc,char *argv[]…

【ChatGPT】如何利用ChatGPT来快速统计Excel数据?

系列文章目录 老板让你写个PPT没有头绪&#xff1f;没事&#xff0c;ChatGPT来帮你&#xff01;传送门 文章目录 系列文章目录前言一、不会公式&#xff1f;帮你生成二、不会处理数据&#xff1f;帮你处理写在最后 前言 自从人工智能横空而出&#xff0c;它在人们的生活中产生…