LeetCode227:基本计算器II
感觉自己的思路还不错,比较简单清晰,代码量也比较少,没有用到记录运算符的变量或栈,就想把这个思路发一下博客。
题目:
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,"+", "-", "*", "/" 四种运算符和空格 " "。 整数除法仅保留整数部分。
思路:
使用一个栈用于暂存得不到计算的数字(无法确定优先级,比如当前是"+",那么可能下一个操作符是"*",所以暂时无法计算)。最终乘除操作符两侧的数会被得到计算并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的更多相关文章
- [Swift]LeetCode227. 基本计算器 II | Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- LeetCode 227. 基本计算器 II(Basic Calculator II)
227. 基本计算器 II 227. Basic Calculator II 题目描述 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+,-,*,/ 四种运算符和 ...
- Leetcode 227.基本计算器II
基本计算器II 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 . 整数除法仅保留整数部分. 示例 1: 输入: " ...
- Java实现 LeetCode 227 基本计算器 II(二)
227. 基本计算器 II 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 . 整数除法仅保留整数部分. 示例 1: 输入: ...
- 227 Basic Calculator II 基本计算器II
实现一个基本的计算器来计算一个简单的字符串表达式. 字符串表达式仅包含非负整数,+, - ,*,/四种运算符和空格 . 整数除法仅保留整数部分. 你可以假定所给定的表达式总是有效的. 一些例子: &q ...
- [LeetCode] 227. Basic Calculator II 基本计算器 II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- [LeetCode] 227. 基本计算器 II
题目链接: https://leetcode-cn.com/problems/basic-calculator-ii 难度:中等 通过率:33.2% 题目描述: 实现一个基本的计算器来计算一个简单的字 ...
- 【LeetCode】基本计算器II
[问题]实现一个基本的计算器来计算一个简单的字符串表达式的值.字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 .整数除法仅保留整数部分. 输入: "3+2*2" ...
- LeetCode227:Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
随机推荐
- Date、Time类型拼接成字符串
Date.Time类型拼接成字符串 语言用的是kotlin,和Java类似 var time = "" val sdf1 = SimpleDateFormat("yyyy ...
- 你的java服务挂了吗
问题背景 最近测试环境服务总是崩溃,运维小哥全部重启后还是崩溃,查看了服务运行情况占用内存确实挺高的,看来是时候优化一波jvm参数了. 优化前 top $(ps -e | grep java | aw ...
- P2871 [USACO07DEC]手链Charm Bracelet(01背包模板)
题目传送门:P2871 [USACO07DEC]手链Charm Bracelet 题目描述 Bessie has gone to the mall's jewelry store and spies ...
- forkjoin及其性能分析,是否比for循环快?
最近看了网上的某公开课,其中有讲到forkjoin框架.在这之前,我丝毫没听说过这个东西,很好奇是什么东东.于是,就顺道研究了一番. 总感觉这个东西,用的地方很少,也有可能是我才疏学浅.好吧,反正问了 ...
- Scala实践13
1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...
- Js字符串按数量分组
代码: function group(ss,step) { var r = []; function doGroup(s) { if (!s) return; r.push(s.substr(0, s ...
- 三个实用的javascript小技巧
从后向前获取数组元素 如果你想从后向前获取一个数组的元素,可以这样写: var newArray = [1, 2, 3, 4] console.log(newArray.slice(-1)) // [ ...
- mysql高级复习
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构,可以简单理解为“排好序的快速查找数据结构”. 数据本身之外,数据库还维护着一 ...
- Spring-cloud微服务实战【六】:接口服务feign
在上一篇文章中,我们使用了ribbon进行负载均衡,但是仔细思考一下,我们的请求封装和调用以及结果的返回都是我们自己编码完成的,如果需要调用的接口很多,那么无疑开发量是比较大的,那有没有比较好的方式呢 ...
- 【数据结构】FHQ Treap详解
FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的.FHQ Treap具有代码短,易理解,速度快的优点.(当然跟红黑树比一下就是 ...