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

news/2024/12/2 19:54:41/

一、题目描述

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

保证字符串中的有效字符包括[‘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)){  //遇到数字则定义num2int 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=='/'){  //遇到×÷定义o2o2 = 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{  //遇到右括号,则出栈,并计算num2int 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.ppmy.cn/news/133552.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…

freertos笔记-队列

红叶何时落水 队列结构体 typedef struct QueueDefinition {int8_t *pcHead; /*< Points to the beginning of the queue storage area. */int8_t *pcTail; /*< Points to the byte at the end of the queue storage area. Onc…

1微型投影仪

神画小媚智能投影仪 光米 连了网络就可以看电影&#xff0c;手机下个软件就可以同步手机&#xff0c;映像清晰&#xff0c;如果是幕布的话效果应该会更好&#xff0c;操作完全简单易懂&#xff0c;完全可以轻易搞定&#xff0c;比连接ps4神马的简单多了。公司开会也可以自带设备…

oracle智能便携投影机,目前最好的便携投影仪,这几款便携投影仪不容错过

原标题&#xff1a;目前最好的便携投影仪&#xff0c;这几款便携投影仪不容错过 近几年投影仪迅速发展&#xff0c;投影仪的分类也越来越多元化&#xff0c;鉴于家用投影仪只能在家摆放使用&#xff0c;迷你投影仪也因此孕育而生。不但可以满足家用&#xff0c;还可以携带&…

html写的代码投屏到LED屏,会议室小间距LED屏可以实现笔记本电脑的无线投屏显示吗?...

原标题&#xff1a;会议室小间距LED屏可以实现笔记本电脑的无线投屏显示吗&#xff1f; 今天小编要给大家介绍一款针对会议室应用的商用级产品,它不仅能给您带来整洁的桌面&#xff0c;稳定的表现&#xff0c;笔记本电脑用户只需将USB按键连接至电脑USB端口&#xff0c;就能分享…

字符串的常用方法

一、操作方法 我们也可将字符串常用的操作方法归纳为增、删、改、查&#xff0c;需要知道字符串的特点是一旦创建了&#xff0c;就不可变。 增 &#x1f355;&#x1f355;并不是说直接增添内容&#xff0c;而是创建字符串的一个副本&#xff0c;再进行操作。除了常用的 以…

Hi3516A开发--视频接口

参看&#xff1a;视频传输端口 参看&#xff1a;几种常用的视频接口 扩展&#xff1a;音视频接口介绍 我们经常在家里的电视机、各种播放器上&#xff0c;视频会议产品和监控产品的编解码器的视频输入输出接口上看到很多视频接口&#xff0c;这些视频接口哪些是模拟接口、哪些…

两个usb摄像头通过hub连接电脑怎么同时独立显示_把电脑装进口袋是什么感觉?华硕VivoStick TS10多角度体验...

自英特尔提出Compute Stick“计算棒”概念后&#xff0c;可谓开创了一个新的电脑形态。它仅比口红略大的身材&#xff0c;在连接显示器等外设之后&#xff0c;“计算棒”就能为用户带来完整的PC体验&#xff0c;对轻办公和对电脑性能要求不高的行业用户来说&#xff0c;计算棒可…