LeetCode-Python-227. 基本计算器 II

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

字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  。 整数除法仅保留整数部分。

示例 1:

输入: "3+2*2"
输出: 7
示例 2:

输入: " 3/2 "
输出: 1
示例 3:

输入: " 3+5 / 2 "
输出: 5
说明:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

第一种思路:

作弊法。

class Solution(object):
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        return eval(s)

第二种思路:

三步走:

1. 将数字和运算符分离

2.优先计算乘除法

3. 最后计算加减法

class Solution(object):
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        s = s.replace(" ", "")
        stack = []
        operation = []
        
        i = 0
        while i < len(s): #分离数字和运算符
            if s[i].isdigit():
                cur = int(s[i])
                while i + 1 < len(s) and s[i + 1].isdigit():
                    cur = cur * 10 + int(s[i + 1])
                    i += 1
                stack.append(cur)
            else:
                operation.append(s[i])
            i += 1
        print stack, operation
        
        i = 0
        while i < len(operation): #处理乘除法
            op = operation[i]
            if op == "*":
                stack[i] = stack[i] * stack[i + 1]
                stack = stack[:i + 1] + stack[i + 2:]
                operation = operation[:i] + operation[i + 1:]
            elif op == "/":
                stack[i] = stack[i] // stack[i + 1]
                stack = stack[:i + 1] + stack[i + 2:]
                operation = operation[:i] + operation[i + 1:]
            else:
                i += 1
            # print stack, operation
            
        res = stack[0]
        for i in range(len(operation)): #计算加减法
            op = operation[i]
            if op == "+":
                res += stack[i + 1]
            elif op == "-":
                res -= stack[i + 1]
        return res

第三种思路:

学习自评论区,优雅的解法。

import operator
class Solution(object):
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        res = []
        calculate = {
            "+": lambda x: res.append(x),
            "-": lambda x: res.append(-x),
            "*": lambda x: res.append(x * res.pop()),
            "/": lambda x: res.append(int(operator.truediv(res.pop(), x)))
        }
        op = "+"
        num = 0
        for char in s + "+":
            if char.isdigit():
                num = num * 10 + int(char)
            elif char != " ":
                calculate[op](num)
                op, num = char, 0
            # print res
        return sum(res)

 


版权声明:本文为qq_32424059原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。