Leetcode 224.基本计算器
基本计算器
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
示例 1:
输入: "1 + 1"
输出: 2
示例 2:
输入: " 2-1 + 2 "
输出: 3
示例 3:
输入: "(1+(4+5+2)-3)+(6+8)"
输出: 23
说明:
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数 eval。
题目分析:最中规中矩的做法就是,先中缀表达式转后缀表达式,然后根据后缀表达式计算答案,Java跑了100ms,算是很慢了,中缀转后缀的方法是:
1.若为数字直接加到后面
2.若为'(',入符号栈
3.若为运算符,则将优先级大于等于它的运算符先弹出并记录带答案,再将其入栈,本题运算符只有+,-,优先级相同
4.若为')',弹出运算符直到遇到'('
因为可能存在不止1位的数字,所以用一个空格来区分,还有就是连字符串的时候StringBuffer要比String快得多
import java.util.Stack;
public class Solution {
public static void solve(Stack<Integer> stkNum, char op) {
int a = stkNum.peek();
stkNum.pop();
int b = stkNum.peek();
stkNum.pop();
if(op == '+') {
stkNum.push(b + a);
}
else if(op == '-') {
stkNum.push(b - a);
}
}
public static String infixToSuffix(String s) {
StringBuffer sb = new StringBuffer("");
Stack<Character> stkOp = new Stack<>();
int num, len = s.length();
for(int i = 0; i < len; i ++) {
char ch = s.charAt(i);
if(ch == ' ') {
continue;
}
else if(ch == '(') {
stkOp.push(ch);
}
else if(ch == '+' || ch == '-') {
while(stkOp.size() > 0 && stkOp.peek() != '(') {
sb.append(stkOp.peek());
stkOp.pop();
}
stkOp.push(ch);
}
else if(ch == ')') {
while(stkOp.peek() != '(') {
sb.append(stkOp.peek());
stkOp.pop();
}
stkOp.pop();
}
else {
num = 0;
while(i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
sb.append(s.charAt(i));
i ++;
}
sb.append(' ');
i --;
}
}
return sb.toString();
}
public static int calculate(String s) {
Stack<Integer> stkNum = new Stack<>();
String str = infixToSuffix('(' + s + ')');
int num = 0;
//System.out.println("str = " + str);
for(int i = 0; i < str.length(); i ++) {
if(str.charAt(i) == '+') {
solve(stkNum, '+');
}
else if(str.charAt(i) == '-') {
solve(stkNum, '-');
}
else {
num = 0;
while(str.charAt(i) != ' ') {
num = num * 10 + str.charAt(i) - '0';
i ++;
}
stkNum.push(num);
}
}
return stkNum.peek();
}
public static void main(String[] args){
calculate("23+45");
}
}
Leetcode 224.基本计算器的更多相关文章
- Java实现 LeetCode 224 基本计算器
224. 基本计算器 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 . 示例 1: 输入: "1 ...
- Leetcode 224/227/772 计算器
题目描述 Leetcode 224 Leetcode 224: 这里想让我们实现一个基础的计算器,来计算给定的字符串. 给定的字符串中包含 ( ) + - 和非负整数和空格. # Example 1: ...
- LeetCode 227. 基本计算器 II(Basic Calculator II)
227. 基本计算器 II 227. Basic Calculator II 题目描述 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+,-,*,/ 四种运算符和 ...
- [LeetCode] 227. 基本计算器 II
题目链接: https://leetcode-cn.com/problems/basic-calculator-ii 难度:中等 通过率:33.2% 题目描述: 实现一个基本的计算器来计算一个简单的字 ...
- [LeetCode] 224. Basic Calculator 基本计算器
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- leetcode 224. Basic Calculator 、227. Basic Calculator II
这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...
- [leetcode]224. Basic Calculator
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- Leetcode 227.基本计算器II
基本计算器II 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 . 整数除法仅保留整数部分. 示例 1: 输入: " ...
- 【LeetCode】基本计算器II
[问题]实现一个基本的计算器来计算一个简单的字符串表达式的值.字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 .整数除法仅保留整数部分. 输入: "3+2*2" ...
随机推荐
- vue中的问题思考
1.为什么 data 要写成函数,而不允许写成对象? 思考:data是 Vue 实例上的一个属性.2. 对象是对于内存地址的引用.3. 函数有自己的作用域空间. 第一点无可厚非,data属性附着于 V ...
- Joystick
Joystick相当于5个按键的集合,向上.下.左.右.中间5个方向接通,经常用于游戏场合.
- RabbitMQ八:交换机类型Exchange Types--Topic介绍
前言 上一章节,我们说了两个类型,本章我们说一下其三:Topic Exchange Topic Exchange Topic Exchange – 将路由键和某模式进行匹配.此时队列需要绑定要一个模 ...
- 【转】java编程思想第20章的注解例子用到的com.sun.mirror的jar包
Java編程思想>中的注解代码中引入过这么一个包(com.sun.mirror),书上说的是在Jdk中有个tools.jar中,引入这个包就每这个问题了,但是笔者用的是JDK 1.8,把这个包i ...
- elasticsearch 2.4.0安装说明
首先从官网下载安装包,是个压缩文件,然后解压 在es目录下找到es的配置文件 修改集群(cluster)名称 PS:一般情况下一台机只部署一个es程序,也就是一个集群,默认集群名是ewater_mai ...
- C#读取web.config配置文件内容
1.对配置文件的访问. 方法一: string myConn =System.Configuration.ConfigurationManager.ConnectionStrings["sq ...
- 获取父页面的dom元素
$("li.jericho_tabs", window.top.document); 上面的代码意思是获取父页面的li元素,class为jericho_tabs的所有元素.
- js 字符串截取 substring() 方法、 substr() 方法、slice() 方法、split() 、join();
三种 js 截取字符串的方法: substring() 方法: substr() 方法: slice() 方法: 1.:substring() 方法:string.substring(from, to ...
- _ 下划线 vue mixins 混入 变量前有下划线 变量不起作用
_ 下划线 vue mixins 混入 变量前有下划线 变量不起作用
- typescript知识教程
https://ts.xcatliu.com/basics/type-of-function.html