博客
关于我
Leetcode: Ternary Expression Parser
阅读量:806 次
发布时间:2023-01-31

本文共 3374 字,大约阅读时间需要 11 分钟。

Given a string representing arbitrarily nested ternary expressions, calculate the result of the expression. You can always assume that the given expression is valid and only consists of digits 0-9, ?, :, T and F (T and F represent True and False respectively).Note:The length of the given string is ≤ 10000.Each number will contain only one digit.The conditional expressions group right-to-left (as usual in most languages).The condition will always be either T or F. That is, the condition will never be a digit.The result of the expression will always evaluate to either a digit 0-9, T or F.Example 1:Input: "T?2:3"Output: "2"Explanation: If true, then result is 2; otherwise result is 3.Example 2:Input: "F?1:T?4:5"Output: "4"Explanation: The conditional expressions group right-to-left. Using parenthesis, it is read/evaluated as:             "(F ? 1 : (T ? 4 : 5))"                   "(F ? 1 : (T ? 4 : 5))"          -> "(F ? 1 : 4)"                 or       -> "(T ? 4 : 5)"          -> "4"                                    -> "4"Example 3:Input: "T?T?F:5:3"Output: "F"Explanation: The conditional expressions group right-to-left. Using parenthesis, it is read/evaluated as:             "(T ? (T ? F : 5) : 3)"                   "(T ? (T ? F : 5) : 3)"          -> "(T ? F : 3)"                 or       -> "(T ? F : 5)"          -> "F"                                    -> "F"

My First Solution:

Use Stack and String operation, from the back of the string, find the first '?', push the right to stack. Depends on whether the char before '?' is 'T' or 'F', keep the corresponding string in the stack

1 public class Solution { 2     public String parseTernary(String expression) { 3         Stack
st = new Stack
(); 4 int pos = expression.lastIndexOf("?"); 5 while (pos > 0) { 6 if (pos < expression.length()-1) { 7 String str = expression.substring(pos+1); 8 String[] strs = str.split(":"); 9 for (int i=strs.length-1; i>=0; i--) {10 if (strs[i].length() > 0)11 st.push(strs[i]);12 }13 }14 String pop1 = st.pop();15 String pop2 = st.pop();16 if (expression.charAt(pos-1) == 'T') st.push(pop1);17 else st.push(pop2);18 expression = expression.substring(0, pos-1);19 pos = expression.lastIndexOf("?");20 }21 return st.pop();22 }23 }

Better solution, refer to https://discuss.leetcode.com/topic/64409/very-easy-1-pass-stack-solution-in-java-no-string-concat/2

No string contat/substring operation

1 public String parseTernary(String expression) { 2     if (expression == null || expression.length() == 0) return ""; 3     Deque
stack = new LinkedList<>(); 4 5 for (int i = expression.length() - 1; i >= 0; i--) { 6 char c = expression.charAt(i); 7 if (!stack.isEmpty() && stack.peek() == '?') { 8 9 stack.pop(); //pop '?'10 char first = stack.pop();11 stack.pop(); //pop ':'12 char second = stack.pop();13 14 if (c == 'T') stack.push(first);15 else stack.push(second);16 } else {17 stack.push(c);18 }19 }20 21 return String.valueOf(stack.peek());22 }

 

转载地址:http://gmgyk.baihongyu.com/

你可能感兴趣的文章
MySQL集群解决方案(4):负载均衡
查看>>
MySQL集群解决方案(5):PXC集群
查看>>
MySQL面试宝典
查看>>
WAP短信:融合传统短信和互联网的新型通信方式
查看>>
mysql面试题学校三表查询_mysql三表查询分组后取每组最大值,mysql面试题。
查看>>
Mysql面试题精选
查看>>
MySQL面试题集锦
查看>>
mysql面试题,存储引擎InnoDB和MyISAM
查看>>
mysql面试题:为什么MySQL单表不能超过2000W条数据?
查看>>
mysql面试题:创建索引时会不会锁表?
查看>>
mysql面试题:高度为3的B+树可以存放多少数据?
查看>>
mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破
查看>>
mysql驱动、durid、mybatis之间的关系
查看>>
mysql驱动支持中文_mysql 驱动包-Go语言中文社区
查看>>
MySQL高可用之——keepalived+互为主从
查看>>
MySQL高可用切换_(5.9)mysql高可用系列——正常主从切换测试
查看>>
MySQL高可用解决方案
查看>>
MySQL高可用解决方案详解
查看>>
MYSQL高可用集群MHA架构
查看>>
MySQL高可用集群架构MHA企业级实战
查看>>