脑洞解法
原题如下:
给你一个以字符串形式表述的 布尔表达式(boolean)expression,返回该式的运算结果。
有效的表达式需遵循以下约定:
“t”,运算结果为 True
“f”,运算结果为 False
“!(expr)”,运算过程为对内部表达式expr进行逻辑非的运算(NOT)
“&(expr1,expr2,…)”,运算过程为对2个或以上内部表达式expr1, expr2, …进行逻辑与的运算(AND)
“|(expr1,expr2,…)”,运算过程为对2个或以上内部表达式expr1, expr2, …进行逻辑或的运算(OR)示例:
输入:expression = “|(&(t,f,t),!(t))”
输出:false来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/parsing-a-boolean-expression
正经做法应该是用栈去解析字符串。但实际上题中对于布尔表达式的定义与开发语言中的表达式类似,同时很多开发语言是带有eval函数的(比如Python),可以把字符串当作代码语句来执行。因此可以取巧来做:
- 我们把题中定义的布尔表达式转换为Python的正经表达式s
- 使用eval(s)来求得表达式的布尔结果
理论存在,实践开始:
- 题中&(t, f)和|(f, t)和Python函数调用格式类似,编两个函数,并把&和|替换成函数名
- t替换成True,f替换成False
- !替换成not
- eval(替换好的字符串)
1 | class Solution: |
Py里的一些注意点
另外mark一下,Python里,逻辑运算符的结果并不是布尔类型。
对于and来说:
- 当and两边条件为“真”时,返回的是and右边的值
- 当and两边条件为“一真一假”时,返回的是条件为“假”的值
- 当and两边条件都为“假”时,返回的是and左边的值
对于or来说:
- 当or两边条件都为“真”时,返回的是or左边的值
- 当or两边条件为“一真一假”时,返回的是条件为“真”的值
- 当or两边条件都为“假”时,返回的是or右边的值