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" ...
随机推荐
- Backbone.js入门教程第二版笔记(3)
视图渲染 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- MySQL GTID复制
什么是GTID 什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能.GTID是事 ...
- RHEL 6.5----Varnish缓存服务器
主机名 IP 服务 master 192.168.30.130 varnish slave 192.168.30.131 httpd WebServer 192.168.30.1 ...
- APPCLOUD禁止滚动条
- 使用grunt构建前端项目
1. grunt构建工具是基于nodejs上的,所以在使用之前一定要先安装好nodejs 2. 安装好nodejs后,node -v查看node版本 npm-v 查看npm版本信息 3. 在需要用到的 ...
- 11.1Java-接口
一.接口 interface定义:固定格式 public abstract 返回值类型 方法名字(参数列表);代码: public interface AMyInterface { public ab ...
- CF765C Table Tennis Game 2
题意: Misha and Vanya have played several table tennis sets. Each set consists of several serves, each ...
- canvas画笑脸
<style> body { background: black; text-align: center; } #cans { background: white; } < ...
- phpstorm 格式化代码
MAC 安装phpcs.phpcbf composer global require 'squizlabs/php_codesniffer=*' Changed current directory t ...
- uva1153 Keep the Customer Satisfied
贪心加优先队列 (默认是小的在前,正好) //这里又很套路,设队列里的都是符合条件的考虑新加入的即可.再处理一下空队列的情况.很完美// 截止时间短的在前面,干的就多先根据截止日期排序优先队列根据完成 ...