zoukankan      html  css  js  c++  java
  • 【leetcode】227. Basic Calculator II

    题目如下:

    Implement a basic calculator to evaluate a simple expression string.

    The expression string contains only non-negativeintegers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

    Example 1:

    Input: "3+2*2"
    Output: 7
    

    Example 2:

    Input: " 3/2 "
    Output: 1

    Example 3:

    Input: " 3+5 / 2 "
    Output: 5
    

    Note:

    • You may assume that the given expression is always valid.
    • Do not use the eval built-in library function.

    解题思路:我的方法分成两部分,第一部分是先计算乘除,完成后再计算表达式中剩余的加减。从头开始遍历Input,并用list保存把每个操作数和操作符保存起来,如果遇到'*'或者'/'操作符,把list中最后一个元素和操作符后面的第一个元素进行计算,求得值后更新到list中最后一个元素,这样list中就剩下加减操作,再计算一次即可。例如"1+2*3*4",在计算过程中list中保存的内容如下所示,

    []
    [1]
    [1, '+']
    [1, '+',2]
    [1, '+', 2, '*']
    [1, '+', 6]
    [1, '+', 6, '*']
    [1, '+', 12]
    [1, '+', 12, '*']
    [1, '+', 24]

    最后在计算加减的时候,我用了list的pop方法(如下面代码中注释掉的部分),结果超时了,但是通过下标遍历就可以通过。看来在python里面,pop方法的效率非常低。

    代码如下:

    class Solution(object):
        """
        :type s: str
        :rtype: int
        """
        def calculate(self, s):
            l = []
            s += '#'
            operator = ['+', '-', '*', '/', '#']
            last = ''
            for i in s:
                if i in operator:
                    if len(l) > 0 and l[-1] in ['*','/']:
                        op = l.pop(-1)
                        if op == '*':
                            v = l[-1] * int(last)
                        else:
                            v = l[-1] / int(last)
                        l[-1] = v
                    else:
                        l.append(int(last))
                    last = ''
                    if i != '#':
                        l.append(i)
                elif i != ' ':
                    last += i
    
            '''
            # time exceed limit
            val = l.pop(0)
            while len(l) >= 2:
                op = l.pop(0)
                next_val = l.pop(0)
                if op == '+':
                    val += next_val
                else:
                    val -= next_val
            return val
            '''
    
            val = l[0]
            for i in range(1,len(l)-1,2):
                op = l[i]
                next_val = l[i+1]
                if op == '+':
                    val += next_val
                else:
                    val -= next_val
            return val
  • 相关阅读:
    配置win 10 邮件 账户同步,适用所有邮件商(QQ,189等)
    OBS 捕获显示器黑屏解决办法(已解决,win10)
    备份,基于规则行业分类
    layui 两级表头 代码观赏
    java 保存 json 格式文件代码函数,可直接使用
    layui 二级表头 示例代码
    python 处理文件路径(已知路径,获得后缀,文件名称)
    从Infinity Fabric到Infinity Architecture
    Turing Award 2020-奠定了编译器设计的基础
    Understanding Intel Ice Lake Processor
  • 原文地址:https://www.cnblogs.com/seyjs/p/11395022.html
Copyright © 2011-2022 走看看