资讯专栏INFORMATION COLUMN

[LeetCode] 772. Basic Calculator III

BlackHole1 / 2025人阅读

Problem

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 .

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 + 1" = 2
  2. " 6-4 / 2 " = 4
  3. "2*(5+5*2)/3+(6/2+8)" = 21
  4. "(2+6* 3+5- (3*14/7+2)*5)+3"=-12

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

Solution

</>复制代码

  1. class Solution {
  2. public int calculate(String s) {
  3. s = s.replaceAll(" ", "");
  4. if (s.length() == 0) return 0;
  5. Stack stack = new Stack<>();
  6. char sign = "+";
  7. int res = 0, pre = 0, i = 0;
  8. while (i < s.length()) {
  9. char ch = s.charAt(i);
  10. //consecutive digits as a number, save in `pre`
  11. if (Character.isDigit(ch)) {
  12. pre = pre*10+(ch-"0");
  13. }
  14. //recursively calculate results in parentheses
  15. if (ch == "(") {
  16. int j = findClosing(s.substring(i));
  17. pre = calculate(s.substring(i+1, i+j));
  18. i += j;
  19. }
  20. //for new signs, calculate with existing number/sign, then update number/sign
  21. if (i == s.length()-1 || !Character.isDigit(ch)) {
  22. switch (sign) {
  23. case "+":
  24. stack.push(pre); break;
  25. case "-":
  26. stack.push(-pre); break;
  27. case "*":
  28. stack.push(stack.pop()*pre); break;
  29. case "/":
  30. stack.push(stack.pop()/pre); break;
  31. }
  32. pre = 0;
  33. sign = ch;
  34. }
  35. i++;
  36. }
  37. while (!stack.isEmpty()) res += stack.pop();
  38. return res;
  39. }
  40. //Eliminate all "()" pairs, calculate the result in between and save in `pre`
  41. private int findClosing(String s) {
  42. int level = 0, i = 0;
  43. for (i = 0; i < s.length(); i++) {
  44. if (s.charAt(i) == "(") level++;
  45. else if (s.charAt(i) == ")") {
  46. level--;
  47. if (level == 0) break;
  48. } else continue;
  49. }
  50. return i;
  51. }
  52. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77149.html

相关文章

  • Leetcode[227] Basic Calculator II

    摘要:复杂度思路用两个来分别记录当前的结果和操作符注意每一次统计当前的的时候,要看一下下一位的操作符。有一种的方法,是表示的是匹配任意的空白符,包括空格,制表符,换行符,中文全角空格等。也可以用更简单的方法,。 LeetCode[227] Basic Calculator II Implement a basic calculator to evaluate a simple expres...

    chaos_G 评论0 收藏0
  • Leetcode[224] Basic Calculator

    摘要:复杂度思路将字符串先转换成后缀表达式,再将其出来。 Leetcode[224] Basic Calculator Implement a basic calculator to evaluate a simple expression string. The expression string may contain open ( and closing parentheses ),...

    William_Sang 评论0 收藏0
  • [LeetCode] 227. Basic Calculator II

    Problem 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 sho...

    silvertheo 评论0 收藏0
  • [LeetCode] 224. Basic Calculator

    Problem 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 e...

    xiangzhihong 评论0 收藏0
  • 224. Basic Calculator & 227. Basic Calculator

    摘要:题目链接,就是感觉条件有点多简单点的写法,把直接用存在里面,就存成,存成题目链接这题就是碰到在加减后面怎么处理的问题。用一个来表示之前的,所以碰到现在是乘的时候就,除类似。 224. Basic Calculator 题目链接:https://leetcode.com/problems... stack,就是感觉条件有点多 public class Solution { pub...

    _DangJin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<