Basic Calculator I

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.

分析:这题因为不存在乘法和除法,所以,对于里面的减号,我们可以把它当成+(-num)来处理。所以,每次遇到一个数字的时候,我们需要知道这个数字的符号,每当我们把这个数字所有的digit都拿到以后,就可以得到这个数,然后把这个数加到之前的临时结果里。

对于比较特殊的处理是括号,但是这里有一个很巧的思路,我们可以把括号里的表达式call当前的方法来计算。

 class Solution {
public int calculate(String s) {
int res = , num = , sign = , n = s.length();
for (int i = ; i < n; ++i) {
char c = s.charAt(i);
if (c >= '' && c <= '') {
num = * num + (c - '');
} else if (c == '(') {
int j = i, cnt = ;
for (; i < n; ++i) {
char letter = s.charAt(i);
if (letter == '(') ++cnt;
if (letter == ')') --cnt;
if (cnt == ) break;
}
num = calculate(s.substring(j + , i));
}
if (c == '+' || c == '-' || i == n - ) {
res += sign * num;
num = ;
sign = (c == '+') ? : -;
}
}
return res;
}
}

Basic Calculator II

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

Note: Do not use the eval built-in library function.

分析:因为没有括号,所以我们可以把加或者减的部分当成一个数,比如 5-2,把它当成(5)+(-2)。同理,对于有乘或者除,或者既有乘又有除的话,也把它当成一个数,比如5-3*2/4=(5)-(3*2/4)。对于乘法和除法,我们总是从左算到右,所以我们可以把* or /之前的部分先存下来,当符号是 * or /的时候,再取出来就可以了。

注意:我们处理的时候,总是处理之前一个符号,而不是当前符号

 class Solution {
public int calculate(String s) {
int res = , num = , n = s.length();
char op = '+';
Stack<Integer> st = new Stack<>();
for (int i = ; i < n; ++i) {
char ch = s.charAt(i);
if (Character.isDigit(ch)) {
num = num * + ch - '';
} else if (isOperator(ch)) {
addToStack(op, num, st);
op = ch;
num = ;
}
}
// handle last case
addToStack(op, num, st);
while (!st.empty()) {
res += st.pop();
}
return res;
} private boolean isOperator(char ch) {
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
return true;
}
return false;
} private void addToStack(char op, int num, Stack<Integer> st) {
if (op == '+') st.push(num);
if (op == '-') st.push(-num);
if (op == '*' || op == '/') {
int tmp = (op == '*') ? st.pop() * num : st.pop() / num;
st.push(tmp);
}
}
}

Basic Calculator III

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negativeintegers and empty spaces .

The expression string contains only non-negative integers, +-*/ operators , open ( and closing parentheses ) and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid. All intermediate results will be in the range of [-2147483648, 2147483647].

Some examples:

"1 + 1" = 2
" 6-4 / 2 " = 4
"2*(5+5*2)/3+(6/2+8)" = 21
"(2+6* 3+5- (3*14/7+2)*5)+3"=-12

Note: Do not use the eval built-in library function.

分析:只要把括号部分的处理加进来就可以了。

 class Solution {
public int calculate(String s) {
int res = , num = , n = s.length();
char op = '+';
Stack<Integer> st = new Stack<>();
for (int i = ; i < n; ++i) {
char ch = s.charAt(i);
if (Character.isDigit(ch)) {
num = num * + ch - '';
} else if (ch == '(') {
int j = i, cnt = ;
for (; i < n; ++i) {
char letter = s.charAt(i);
if (letter == '(') ++cnt;
if (letter == ')') --cnt;
if (cnt == ) break;
}
num = calculate(s.substring(j + , i));
} else if (isOperator(ch)) {
addToStack(op, num, st);
op = ch;
num = ;
}
}
// handle last case
addToStack(op, num, st);
while (!st.empty()) {
res += st.pop();
}
return res;
} private static boolean isOperator(char ch) {
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
return true;
}
return false;
} private static void addToStack(char op, int num, Stack<Integer> st) {
if (op == '+') st.push(num);
if (op == '-') st.push(-num);
if (op == '*' || op == '/') {
int tmp = (op == '*') ? st.pop() * num : st.pop() / num;
st.push(tmp);
}
}
}

Basic Calculator I && II && III的更多相关文章

  1. (Stack)Basic Calculator I && II

    Basic Calculator I Implement a basic calculator to evaluate a simple expression string. The expressi ...

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

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

  3. [LeetCode] Basic Calculator II 基本计算器之二

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

  4. LeetCode Basic Calculator II

    原题链接在这里:https://leetcode.com/problems/basic-calculator-ii/ Implement a basic calculator to evaluate ...

  5. Lintcode: Expression Evaluation (Basic Calculator III)

    Given an expression string array, return the final result of this expression Have you met this quest ...

  6. Basic Calculator,Basic Calculator II

    一.Basic Calculator Total Accepted: 18480 Total Submissions: 94750 Difficulty: Medium Implement a bas ...

  7. [LeetCode] Basic Calculator III 基本计算器之三

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  8. leetcode 224. Basic Calculator 、227. Basic Calculator II

    这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...

  9. 【LeetCode】227. Basic Calculator II

    Basic Calculator II Implement a basic calculator to evaluate a simple expression string. The express ...

随机推荐

  1. Python小数据池和字典操作

    小数据池 #id 查看内存地址 #多个代码块可以使用小数据池 #一个代码块中有一个问题,就是重复使用 #数字 -5~256 #字符串 字符串 乘法总数长度不能超过20, 0,1除外 #不能有特殊字符 ...

  2. linux查询日志常用命令,经常更新

    1.grep命令 grep -c "查询内容" filename    ------c,是小写,可以知道你要查询的内容在这个文件中是否存在 grep -C 10 "查询内 ...

  3. [Alpha阶段]第六次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第六次Scrum Meeting 基本信息 名称 时间 地点 时长 第六次Scrum Meeting 19/04/10 教2 1层 50min 相 ...

  4. DOTween坑点

    Sequence相关 如实现一个物体有序列的运动,A->B->C,需要实例化Sequence与实现方法在同一处调用. Sequence m_Sequence; void SequenceM ...

  5. python爬虫爬取赶集网数据

    一.创建项目 scrapy startproject putu 二.创建spider文件 scrapy genspider  patubole patubole.com   三.利用chrome浏览器 ...

  6. 爬虫免登录进入github

    import requests import re ret = requests.get('https://github.com/login') print(ret.headers) cookies ...

  7. windows下零基础gulp构建

    在学习前,先谈谈大致使用gulp的步骤,给读者以初步的认识.首先当然是安装nodejs,通过nodejs的npm全局安装和项目安装gulp,其次在项目里安装所需要的gulp插件,然后新建gulp的配置 ...

  8. BZOJ5506 GXOI/GZOI2019旅行者(最短路)

    本以为是个二进制分组傻逼题https://www.cnblogs.com/Gloid/p/9545753.html,实际上有神仙的一个log做法https://www.cnblogs.com/asul ...

  9. mongoDB 数据库简介

    背景概念-数据库类型 对比关系型数据库 优点 : 逻辑清晰.容易理解,结构类似表格 使用 sql 语句技术成熟,使用方便 数据一致性好,完整性好 关系型数据库比较成熟,可以使用一些复杂操作 缺点 : ...

  10. JVM运行时内存组成分为一些线程私

    JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...