[LeetCode] 227. Basic Calculator II

Given a string s which represents an expression, evaluate this expression and return its value

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 [-231, 231 - 1].

Note: You are not allowed to use any built-in function which evaluates strings as mathematical expressions, such as eval().

Example 1:

Input: s = "3+2*2"
Output: 7

Example 2:

Input: s = " 3/2 "
Output: 1

Example 3:

Input: s = " 3+5 / 2 "
Output: 5

Constraints:

  • 1 <= s.length <= 3 * 105
  • s consists of integers and operators ('+', '-', '*', '/') separated by some number of spaces.
  • s represents a valid expression.
  • All the integers in the expression are non-negative integers in the range [0, 231 - 1].
  • The answer is guaranteed to fit in a 32-bit integer.

基本计算器 II。

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题意跟版本一基本一样,多了乘法和除法的操作但是省去了括号,同时需要skip中间遇到的空格。有了乘法和除法的话,计算就需要有优先级。思路依然是用stack,也是按字符遍历input,遇到乘号和除号的时候需要把栈顶元素pop出来,先计算乘法/除法,把计算后的结果再放入栈内。如果遇到一个字符既不是数字也不是空格,那么一定是一个运算符。如果遇到的是加号或者减号,则把他变成栈顶元素的正号/负号;如果是乘号/除号的话则进行计算,把计算结果入栈。在这道题中,运算符号是不入栈的,最后从stack弹出元素的时候,所有元素之间做的只有加法。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public int calculate(String s) {
 3         Deque<Integer> stack = new ArrayDeque<>();
 4         int res = 0;
 5         char sign = '+';
 6         int num = 0;
 7         for (int i = 0; i < s.length(); i++) {
 8             if (Character.isDigit(s.charAt(i))) {
 9                 num = s.charAt(i) - '0';
10                 while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
11                     num = num * 10 + s.charAt(i + 1) - '0';
12                     i++;
13                 }
14             }
15             // 不是数字不是空格又不是最后一个字符,那么一定是一个运算符号
16             // 最后一个字符有可能是一个单独的数字,需要特别处理
17             if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == s.length() - 1) {
18                 if (sign == '+') {
19                     stack.push(num);
20                 }
21                 if (sign == '-') {
22                     stack.push(-num);
23                 }
24                 if (sign == '*') {
25                     stack.push(stack.pop() * num);
26                 }
27                 if (sign == '/') {
28                     stack.push(stack.pop() / num);
29                 }
30                 sign = s.charAt(i);
31                 num = 0;
32             }
33         }
34 
35         for (int i : stack) {
36             res += i;
37         }
38         return res;
39     }
40 }

 

相关题目

224. Basic Calculator

227. Basic Calculator II

772. Basic Calculator III

LeetCode 题目总结

posted @ 2020-05-17 05:51  CNoodle  阅读(204)  评论(0编辑  收藏  举报