感觉自己的思路还不错,比较简单清晰,代码量也比较少,没有用到记录运算符的变量或栈,就想把这个思路发一下博客。

题目:

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,"+", "-", "*", "/" 四种运算符和空格 " "。 整数除法仅保留整数部分。

思路:

使用一个栈用于暂存得不到计算的数字(无法确定优先级,比如当前是"+",那么可能下一个操作符是"*",所以暂时无法计算)。最终乘除操作符两侧的数会被得到计算并push进栈,最后相加即可。比如:

2 - 1 + 3 * 4 - 4 / 2 * 1   =>  2 - 1 + [ 3 * 4 ] + [ -4 / 2 * 1 ] =>  最终栈里面的情况为 [2, -1, 12, -2],然后计算和即可。

情况如下:

  • 如果是空格,跳过即可;
  • 如果是"+"或数字字符,则向栈中push进一个数字;
  • 如果是"-",则获得下一个数字,并向栈中push进它的负数形式;
  • 如果是"*",则获得下一个数字,并向栈中push进栈顶数字和下一个数字的乘积;
  • 如果是"/",则获得下一个数字,并向栈中push进栈顶数字和和一个数字的商。
class Solution {
public int calculate(String s) {
Deque<Integer> stack = new ArrayDeque<>();
char ch;
int[] ret;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (ch == ' ')
continue;
ret = getNextNumber(s, i);
if (Character.isDigit(ch) || ch == '+') {
stack.push(ret[0]);
} else if (ch == '-') {
stack.push(-ret[0]);
} else if (ch == '*') {
stack.push(stack.pop() * ret[0]);
} else if (ch == '/') {
stack.push(stack.pop() / ret[0]);
}
i = ret[1]; //调整索引为,获得的下一个数字的末尾索引
}
// 返回计算结果
int[] ans = {0};
stack.forEach(num -> ans[0] += num);
return ans[0];
}
// 返回下一个数字
private int[] getNextNumber(String s, int i) {
int num = 0;
while (!Character.isDigit(s.charAt(i)))
i++;
while (i < s.length() && Character.isDigit(s.charAt(i)))
num = 10 * num + s.charAt(i++) - '0';
return new int[] {num, i-1}; // 返回得到的数字及该数字最后一个数字字符的索引
}
}

  

LeetCode227:基本计算器II的更多相关文章

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

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  2. LeetCode 227. 基本计算器 II(Basic Calculator II)

    227. 基本计算器 II 227. Basic Calculator II 题目描述 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+,-,*,/ 四种运算符和 ...

  3. Leetcode 227.基本计算器II

    基本计算器II 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  . 整数除法仅保留整数部分. 示例 1: 输入: " ...

  4. Java实现 LeetCode 227 基本计算器 II(二)

    227. 基本计算器 II 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 . 整数除法仅保留整数部分. 示例 1: 输入: ...

  5. 227 Basic Calculator II 基本计算器II

    实现一个基本的计算器来计算一个简单的字符串表达式. 字符串表达式仅包含非负整数,+, - ,*,/四种运算符和空格 . 整数除法仅保留整数部分. 你可以假定所给定的表达式总是有效的. 一些例子: &q ...

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

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  7. [LeetCode] 227. 基本计算器 II

    题目链接: https://leetcode-cn.com/problems/basic-calculator-ii 难度:中等 通过率:33.2% 题目描述: 实现一个基本的计算器来计算一个简单的字 ...

  8. 【LeetCode】基本计算器II

    [问题]实现一个基本的计算器来计算一个简单的字符串表达式的值.字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  .整数除法仅保留整数部分. 输入: "3+2*2" ...

  9. LeetCode227:Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

随机推荐

  1. Java环境准备

    电脑重装系统了,所以需要重新配置环境变量. 首先必备工具:jak.eclipse.maven.tomcat 首先配置Java运行环境. 在系统环境变量中新建变量JAVA_HOME:jdk所在的路径,P ...

  2. MinIO 搭建使用

    MinIO简介¶ MinIO 是一款基于Go语言的高性能对象存储服务,在Github上已有19K+Star.它采用了Apache License v2.0开源协议,非常适合于存储大容量非结构化的数据, ...

  3. JVM系列六(自定义插入式注解器).

    一.概述 从前面 文章 中我们可以了解到,javac 的三个步骤中,程序员唯一能干预的就是注解处理器部分,注解处理器类似于编译器的插件,在这些插件里面,可以读取.修改.添加抽象语法树中的任意元素.因此 ...

  4. php改变时间的方法

    1. strtotime date("Y-m-d",strtotime('+1day')) 2. mktime date("Y-m-d",mktime(0,0, ...

  5. echarts更改折线图区域颜色、折线颜色、折点颜色

    series : [ { name:'订单流入总数', type:'line', stack: '总量', areaStyle: { normal: { color: '#8cd5c2' //改变区域 ...

  6. redis最新版本安装及开机自启

    的系统是ubuntu,安装方式有多种,一种是通过apt仓库,一种是下载源码,编译安装 1.通过apt仓库 具体命令: sudo apt-get update sudo apt-get install ...

  7. python封装简介

    1.效果图: 对比一: 对比二: 2.学习来源代码: # 封装是面向对象的三大特性之一 # 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 # 如何隐藏一个对象中的属性? # - 将对象的属 ...

  8. Centos7.6部署k8s v1.16.4高可用集群(主备模式)

    一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...

  9. Nginx. 用http访问https跨域

    用http 访问 https域名, 报跨越问题 解决方法: 在nginx相应服务的转发配置下添加: add_header 'Access-Control-Allow-Origin' 'http://i ...

  10. jdbc实现批量提交rollback

    最近上了一个老项目,要修改一些业务,具体的思路是在jsp中实现对数据的某些批量操作,因此做一下笔记. 1.整体jdbc建立连接/关闭连接 conn = DbUtil.getConnection(); ...