文章目录
- 1. 题目
- 2. 解题
- 2.1 递归
- 2.2 循环
1. 题目
给定一个以字符串表示的任意嵌套的三元表达式,计算表达式的值。
你可以假定给定的表达式始终都是有效的并且只包含数字 0-9, ?, :, T 和 F
(T 和 F 分别表示真和假)。
注意:
给定的字符串长度 ≤ 10000。
所包含的数字都只有一位数。
条件表达式从右至左结合(和大多数程序设计语言类似)。
条件是 T 和 F其一,即条件永远不会是数字。
表达式的结果是数字 0-9, T 或者 F
。
示例 1:
输入: "T?2:3"
输出: "2"
解释: 如果条件为真,结果为 2;否则,结果为 3。示例 2:
输入: "F?1:T?4:5"
输出: "4"
解释: 条件表达式自右向左结合。使用括号的话,相当于:"(F ? 1 : (T ? 4 : 5))" "(F ? 1 : (T ? 4 : 5))"-> "(F ? 1 : 4)" 或者 -> "(T ? 4 : 5)"-> "4" -> "4"示例 3:
输入: "T?T?F:5:3"
输出: "F"
解释: 条件表达式自右向左结合。使用括号的话,相当于:"(T ? (T ? F : 5) : 3)" "(T ? (T ? F : 5) : 3)"-> "(T ? F : 3)" 或者 -> "(T ? F : 5)"-> "F" -> "F"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ternary-expression-parser
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 递归
两种符号? :
数量相等的时候,将字符串切开,递归考虑
class Solution {
public:string parseTernary(string expression) {int c1 = 0, c2 = 0, n = expression.size();for(int i = 1; i < n; ++i){if(expression[i]=='?')c1++;else if(expression[i]==':')c2++;if(c1 == c2){return expression[0]=='T' ? parseTernary(expression.substr(2, i-2)) : parseTernary(expression.substr(i+1));}}return expression;}
};
2.2 循环
- 参考评论区解答
- 逆序遍历,每次 i - 2 找符号
:
把后面的数压栈,?
把前面的数更新为表达式的值,并弹栈
class Solution {
public:string parseTernary(string expression) {stack<char> s1;for(int i = expression.length() - 1; i >= 2; i -= 2)//找?或者:{if(expression[i-1] == ':')//当前是 :s1.push(expression[i]);else//当前是?{expression[i-2] = expression[i-2] == 'T' ? expression[i] : s1.top();// ? 前面 更新为表达式的值s1.pop();}}return string(1,expression[0]);}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!