`

Leetcode - Calculator

 
阅读更多
[分析]
思路1:逆序遍历字符串,数字和右括号保存在一个堆栈stack1中,运算符保存在另一个堆栈stack2中,跳过空格,遇到左括号时计算stack1中首个右括号之上的所有数据,也即当前括号对中的内容。 在Accept之前有两个出错点:1)采用顺序遍历。出错case:2-1+1,因为加减的运算顺序是从左至右;2)逆序遍历时拼接完一个位数大于1的完整int 后要逆序已得到实际数值。出错case: 2147483647
思路2:参考如下两篇文章
https://leetcode.com/discuss/41868/java-solution-stack
https://leetcode.com/discuss/39479/simple-c-in-24-ms
非常不错的思路,简单来说就是将算式映射为没有括号的样子来计算

public class Solution {
    // Method 2
    public int calculate(String s) {
        if (s == null || s.equals(""))
            return 0;
        LinkedList<Integer> signs = new LinkedList<Integer>();
        signs.push(1);
        int currSign = 1;
        int sum = 0;
        for (int i = 0; i < s.length(); i++) {
            int num = 0;
            while (i < s.length() && '0' <= s.charAt(i) && s.charAt(i) <= '9') {
                num = num * 10 + s.charAt(i++) - '0';
            }
            // System.out.println(sum + " " + currSign + " " + signs.peek() + " " + num);
            sum += currSign * signs.peek() * num;
            if (i == s.length()) break;
            char c = s.charAt(i);
            if (c == '+') currSign = 1;
            else if (c == '-') currSign = -1;
            else if (c == '(') {signs.push(signs.peek() * currSign); currSign = 1;}
            else if (c == ')') signs.pop();
        }
        return sum;
    }
    // Method 1
    public int calculate1(String s) {
        if (s == null || s.equals(""))
            return 0;
        LinkedList<String> nums = new LinkedList<String>();
        LinkedList<Character> ops = new LinkedList<Character>();
        int n = s.length();
        int i = n - 1;
        while (i >= 0) {
            StringBuilder num = new StringBuilder();
            while (i >= 0 && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                num.append(s.charAt(i--));
            }
            if (num.length() > 0) {
                nums.push(num.reverse().toString());
                if (i < 0) break;
            }
                
            char c = s.charAt(i);
            if (c == ')') {
                nums.push(")");
            } else if (c == '(') {
                while (!nums.peek().equals(")")) {
                    sum(nums, ops);
                }
                nums.pop();
            } else if (c == '+' || c == '-') {
                ops.push(c);
            }
            i--;
        }
        while (!ops.isEmpty()) {
            sum(nums, ops);
        }
        return !nums.isEmpty() ? Integer.valueOf(nums.pop()) : 0;
    }
    private void sum(LinkedList<String> nums, LinkedList<Character> ops) {
        int num1 = Integer.valueOf(nums.pop());
        if (nums.peek().equals(")")) {
            nums.pop();
            nums.push(String.valueOf(num1));
            nums.push(")");
            return;
        }
        int num2 = Integer.valueOf(nums.pop());
        char op = ops.pop();
        if (op == '+')
            nums.push(String.valueOf(num1 + num2));
        else
            nums.push(String.valueOf(num1 - num2));
    }
}
分享到:
评论
1 楼 qb_2008 2015-06-10  
倒着遍历字符串有点别扭,成了右括号入栈,左括号出栈。不过读数字确实方便
一点。也可以用逆波兰表达式。也可以考虑加减法及时计算,这样左右括号就不必
放在操作数栈中。

相关推荐

    leetcode1-240题中文题解,md格式,java

    2. leetcode-224-Basic-Calculator.md:这是第224题,基础计算器,要求设计一个程序来解析并执行简单的数学表达式。 3. leetcode-214-Shortest-Palindrome.md:第214题,寻找最短回文串,可能涉及到字符串操作和动态...

    c语言-leetcode题解之0224-basic-calculator

    c c语言_leetcode题解之0224_basic_calculator

    c语言-leetcode题解之0991-broken-calculator

    c语言入门 c语言_leetcode题解之0991_broken_calculator

    c语言-leetcode题解之0227-basic-calculator-ii

    c c语言_leetcode题解之0227_basic_calculator_ii

    基本计算器leetcode-Strings-3:字符串-3

    在这个场景中,我们关注的是两个与字符串处理相关的LeetCode问题:将整数转化为英文单词(Problem1 - Integer to English Words)以及实现一个基本的计算器(Problem2 - Basic Calculator)。这两个问题都是字符串...

    leetcode安卓-Modulus-calculator:模数计算器

    leetcode安卓模数计算器 这个android程序有两个简单的计算器,一个用于模数运算,一个用于整数除法 我创建这个是因为这些是解决 Leetcode 的有用操作,而大多数计算器(如默认的 Android 计算器)没有它们

    股票买卖最佳时机leetcode-STONKS:TI-84投资模拟器

    股票买卖最佳时机leetcode 斯托克斯 STONKS:TI-84 Plus CE 计算器的投资模拟器。 如何下载 下载 TI Connect CE 仿真器。 下载 STONKS.8xp 用 USB 电缆连接计算器。 单击 Calculator Exlorer 选项卡。 将文件拖放到...

    java-leetcode题解之Basic Calculator.java

    LeetCode作为一个流行的在线编程练习平台,提供了大量的编程题目,帮助程序员提升算法技能,其中包括了多种难度的题目,例如Basic Calculator。Basic Calculator这道题目要求编写一个能够计算基本算术表达式(只包括...

    java-leetcode题解之Broken Calculator.java

    解决LeetCode中的"Broken Calculator"问题是一次关于算法设计、编码技巧以及测试能力的全面练习。对于希望提升自己编程能力的Java开发者来说,这是一个极好的练习项目。通过这样的实际问题的解决,不仅可以锻炼逻辑...

    java-leetcode题解之Basic Calculator II.java

    Java实现LeetCode基础计算题第二部分(Basic Calculator II)主要涉及计算只包含加减乘除四种运算符的字符串表达式。在编程时,需要考虑表达式的处理顺序以及操作数和运算符之间的关系。具体的算法思路是首先将问题...

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...

    Basic-calculator-interpreter:解决leet代码的基本计算器问题

    本项目“Basic-calculator-interpreter”便是针对这一问题的解决方案,使用Go语言进行编写。 Go语言,又称为Golang,是Google开发的一种静态类型的、编译型的、并发型且具有垃圾回收功能的编程语言。其简洁的语法和...

    leetcode中国-oracle:Oracle

    leetcode中国 买卖股票 从easy一直问到hard 数独 从medium的判断是不是valid 到 hard的solve 数独 从BST里面删除一个node (要求写test case) design就是皮毛的问题。。。我几乎就是把Harvard那个intro system design...

    leetcode题库-cpp-snippets:cpp-snippets

    leetcode题库 Snippets 代码片段 This repository is under construction. More to come soon ... 本代码仓库正在建设中,即将上传大量代码…… Contents ...LeetCode ...Calculator 日期计算器 Click

    Leetcode题目+解析+思路+答案.pdf

    - **Basic Calculator II**:实现一个基本计算器,读取一个表达式并返回计算结果。 本书通过实际编程案例,讲解了各种算法思想和技巧,涵盖了从基础的数据结构(如数组、链表、树)到复杂的问题解决策略(如动态...

    leetcode卡-IntegerCalculator:一个用于执行整数计算的Flask应用程序

    leetcode卡目录 介绍 这是一个基于 LeetCode 中解释的想法实现的简单网络计算器。 计算器将接受任何包含非负整数和运算符的表达式: + * - / ( )并返回一个整数请注意, /此处表示整数除法,因此9/2 = 4而不是4.5 ...

    LeetCode leetcode部分题解答代码实现

    * Basic Calculator II:给定一个字符串,返回其计算结果。这个题目需要使用数学的思想,将字符串分解成更小的子字符串,并计算其结果。 LeetCode 中有很多关于数组、链表、树、动态规划、回溯算法、贪心算法、数学...

    LeetCode:LeetCode问题

    LeetCode ### LeetCode算法 # 标题 解决方案 困难 日期 239 [C ++](./算法/滑动窗口最大值/Source.cpp) 难的 2015年8月5日 ...[C ++](../ Algorithms /使用... [C ++](./ Algorithms / Basic Calculator II / Sour

    LeetCode练习答案

    - **基本计算器II(Basic Calculator II)**: 给定一个字符串表达式,实现一个基本计算器来计算并返回结果。 以上总结仅为部分知识点的简述,对于每一个具体的算法问题,都有其独特的解决思路和技巧,建议深入研究每...

    leetcode添加元素使和等于-njuee_LeetCode_Solutions:本仓库主要记录平时遇到的一些编程问题、算法、思路

    leetcode添加元素使和等于 本项目为Njueers所共享 仓库内容主要为平时刷题的submit、遇到的一些经典题解、coding时所作的笔记等 Basic Knowledge文件夹下为一些基础但相对重要的C++知识点/笔记 Cpp文件夹下主要为...

Global site tag (gtag.js) - Google Analytics