224. Basic Calculator & 227. Basic Calculator II

本文解析了LeetCode中两个计算器问题的基本算法实现。通过使用栈结构,文章详细解释了如何处理基本算术运算,并提供了两种不同复杂度问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

224. Basic Calculator

题目链接:https://leetcode.com/problems...

stack,就是感觉条件有点多

public class Solution {
    public int calculate(String s) {
        Stack<Integer> nums = new Stack();
        Stack<Character> signs = new Stack();
        int prev = 0,  cur = 0;
        char sign = '#';
        int i = 0;
        /* prev: number before sign, cur: number after sign, sign
         * push: meet '(', put prev, sign = '#'
         * pop: meet ')' if not empty
         * number: do caculate if sign != '#'
         */
        // start of number or sign or '(' or ')'
        while(i < s.length()) {
            char c = s.charAt(i);
            // number
            if(Character.isDigit(c)) {
                while(i < s.length() && Character.isDigit(s.charAt(i))) cur = cur * 10 + (s.charAt(i++) - '0');
                i--;
                if(sign == '+')  prev += cur;
                else if(sign == '-')  prev -= cur;
                else prev = cur;
                cur = 0;
            }
            else if(c == '(') {
                // in case of "(1 + 2)"
                if(sign != '#') {
                    nums.push(prev);
                    signs.push(sign);
                    sign = '#';
                    prev = 0;
                }
            }
            else if(c == ')') {
                if(!nums.isEmpty()) {
                    int temp = nums.pop();
                    sign = signs.pop();
                    if(sign == '+') prev += temp;
                    else prev = temp - prev;
                    sign = '#';
                }
            }
            else if(c == '+' || c == '-') sign = c;
            // update
            i++;
        }
        
        return prev;
    }
}

简单点的写法,把sign直接用int存在stack里面,'+'就存成1, '-'存成-1

public class Solution {
    public int calculate(String s) {
        Stack<Integer> nums = new Stack();
        Stack<Integer> signs = new Stack();
        int prev = 0,  cur = 0;
        int sign = 1;
        int i = 0;
        /* prev: number before sign, cur: number after sign, sign
         * push: meet '(', put prev
         * pop: meet ')' if not empty
         * number: do caculate 
         */
        // start of number or sign or '(' or ')'
        while(i < s.length()) {
            char c = s.charAt(i);
            // number
            if(Character.isDigit(c)) {
                while(i < s.length() && Character.isDigit(s.charAt(i))) {
                    cur = cur * 10 + (s.charAt(i++) - '0');
                }
                i--;
                prev = prev + sign*cur;
                cur = 0;
            }
            else if(c == '(') {
                nums.push(prev);
                signs.push(sign);
                sign = 1;
                prev = 0;
            }
            else if(c == ')') {
                prev = nums.pop() + signs.pop() * prev;
            }
            else if(c == '+') sign = 1;
            else if(c == '-') sign = -1;
            // update
            i++;
        }
        
        return prev;
    }
}

227. Basic Calculator II

题目链接:https://leetcode.com/problems...

这题就是碰到'*', '/'在加减后面怎么处理的问题。用一个prev来表示之前的number,所以碰到现在是乘的时候就:res = res - prev + prev * cur, prev = prev * cur,除类似。

public class Solution {
    public int calculate(String s) {
        int res = 0;
        int prev = 0;
        s = s.replaceAll("[^0-9^+-/*]", "");
        int i = 0, n = s.length();
        // first number
        while(i < n && Character.isDigit(s.charAt(i))) {
            prev = prev * 10 + (s.charAt(i++) - '0');
        }
        res = prev;
        // loop invariant: start from sign: -, +, *, /
        while(i < n) {
            char c = s.charAt(i++);
            int cur = 0;
            while(i < n && Character.isDigit(s.charAt(i))) {
                cur = cur * 10 + (s.charAt(i++) - '0');
            }
            if(c == '+') {
                res += cur;
                prev = cur;
            }
            else if(c == '-') {
                res -= cur;
                prev = -cur;
            }
            else if(c == '*') {
                res = res - prev + prev * cur;
                prev *= cur;
            }
            else if(c == '/') {
                res = res - prev + prev / cur;
                prev /= cur;
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值