LeetCode题解(0227):支持四则运算的基础计算器(Python)
发布日期:2021-06-29 19:57:51
浏览次数:2
分类:技术文章
本文共 2344 字,大约阅读时间需要 7 分钟。
题目:(中等)
标签:字符串、栈
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( N ) O(N) O(N) | O ( N ) O(N) O(N) | 156ms (24.17%) |
Ans 2 (Python) | O ( N ) O(N) O(N) | O ( N ) O(N) O(N) | 80ms (98.30%) |
Ans 3 (Python) |
LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,执行用时一般都在同一个量级,仅作参考意义。
解法一(标准逆波兰表达式求值):
class Solution: def calculate(self, s: str) -> int: mark_level = { "+": 0, "-": 0, "*": 1, "/": 1} # 定义符号优先级 # 合并多位数字 group = [] # 合并数字组 for ch in s: if ch.isdigit(): if group and group[-1].isdigit(): group[-1] += ch else: group.append(ch) else: group.append(ch) # 将中缀表达式转换为后缀表达式 expression = [] # 表达式 stack = [] # 符号栈 for ch in group: if ch.isdigit(): expression.append(ch) elif ch in mark_level: while stack and mark_level[stack[-1]] >= mark_level[ch]: expression.append(stack.pop()) stack.append(ch) while stack: expression.append(stack.pop()) # 后缀表达式求值 stack = [] # 数字栈 for ch in expression: if ch.isdigit(): stack.append(int(ch)) else: b = stack.pop() a = stack.pop() if ch == "+": stack.append(a + b) elif ch == "-": stack.append(a - b) elif ch == "*": stack.append(a * b) elif ch == "/": stack.append(a // b) return stack[0]
解法二(直接用栈求解):
class Solution: def calculate(self, s: str) -> int: marks = { "+", "-", "*", "/"} stack = [] # 多项式栈 now_num = "" # 当前数字 last_mark = "+" # 上一个符号 for ch in s + "+": # 在结尾添加无意义的运算符,使最后一个数字可以被计算 if ch.isdigit(): now_num += ch elif ch in marks: num = int(now_num) if last_mark == "+": stack.append(num) elif last_mark == "-": stack.append(-num) elif last_mark == "*": stack[-1] *= num else: stack[-1] = int(stack[-1] / num) now_num = "" last_mark = ch return sum(stack)
转载地址:https://dataartist.blog.csdn.net/article/details/107997796 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月07日 10时09分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
#if DEBUG #endif
2019-04-30
sql server decimal
2019-04-30
SQL Server中Id自增列的最大Id是多少
2019-04-30
AdminLTE
2019-04-30
asp.net core Authorization
2019-04-30
sqlserver dateadd&datediff使用
2019-04-30
SonarQube
2019-04-30
Dapper.Contrib
2019-04-30
asp.ent core swagger
2019-04-30
asp.net core ajax post controller
2019-04-30
Nexus+Nginx+docker
2019-04-30
DTO
2019-04-30
DDD
2019-04-30
wcf messageEncoding="Mtom"
2019-04-30
asp.net core webapi post
2019-04-30
C#中使用TransactionScope类(分布式事务) 和 锁
2019-04-30
SecurityProtocolType
2019-04-30
Consul、Ocelot、Docker
2019-04-30