• [LeetCode] 224. 基本计算器


    题目链接: https://leetcode-cn.com/problems/basic-calculator

    难度:困难

    通过率:34.1%

    题目描述:

    实现一个基本的计算器来计算一个简单的字符串表达式的值。

    字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -非负 整数和空格

    示例:

    输入: "1 + 1"
    输出: 2
    

    示例 2:

    输入: " 2-1 + 2 "
    输出: 3
    

    示例 3:

    输入: "(1+(4+5+2)-3)+(6+8)"
    输出: 23
    

    说明:

    • 你可以假设所给定的表达式都是有效的。
    • 不要 使用内置的库函数 eval

    思路:

    把括号里先算出来,

    最好表达用代码展现出来, 直接看代码!

    两种写法, 第一种好理解, 第二种简介!


    如有疑惑, 欢迎留言~

    相关链接:https://leetcode-cn.com/problems/basic-calculator-ii/

    代码:

    第一种

    class Solution:
        def calculate(self, s: str) -> int:
            res = 0
            stack = []
            sign = 1
            i = 0
            n = len(s)
            while i < n:
                if s[i] == " ":
                    i += 1
                elif s[i] == "-":
                    sign = -1
                    i += 1
                elif s[i] == "+":
                    sign = 1
                    i += 1
                elif s[i] == "(":
                    stack.append(res)
                    stack.append(sign)
                    res = 0
                    sign = 1
                    i += 1
                elif s[i] == ")":
                    # print(stack)
                    res = res * stack.pop() + stack.pop()
                    i += 1
                elif s[i].isdigit():
                    tmp = int(s[i])
                    i += 1
                    while i < n and s[i].isdigit():
                        tmp = tmp * 10 + int(s[i])
                        i += 1
                    res += tmp * sign
            return res
    

    第二种

    class Solution:
        def calculate(self, s: str) -> int:
            stack = []
            # 记录数字的符号, 因为题目说没有负数,说明第一个为正数,设为1
            sign = 1
            # 数字
            num = 0
            # 结果
            res = 0
            for c in s:
                if c.isdigit():
                    num = num * 10 + int(c)
                elif c == "+":
                    res += sign * num
                    # 为下一次做准备
                    num = 0
                    sign = 1
                elif c == "-":
                    res += sign * num
                    # 为下一次做准备
                    num = 0
                    sign = -1
                elif c == "(":
                    stack.append(res)
                    stack.append(sign)
                    sign = 1
                    res = 0
                elif c == ")":
                    res += sign * num
                    num = 0
                    res = stack.pop() * res + stack.pop()
            res += sign * num
            return res
    
  • 相关阅读:
    15、编写ORM
    14、细说协程
    COOKIE欺骗
    聪明的小羊
    re.S函数 python3
    截断上传
    sql百态01-post
    Why not?
    随机字符的本地爆破
    HTTP协议-请求头,响应头
  • 原文地址:https://www.cnblogs.com/powercai/p/11481827.html
Copyright © 2020-2023  润新知