1、题目描述
2、解题思路
思路:问号 ‘?’ 和冒号 ‘:’ 的数量是一定相同的,我们只需要确认问号和哪个冒号是一套的即可。
把 “?” “:” 看成括号,就可以确定一组三元表达式了。
比如 “T?T?F:5:3” ,看成 “T ( T ( F ) 5 ) 3” ,于是可以确定是这样的 “(T ? (T ? F : 5) : 3)”
因为所给的数字都只有一位数,因此,解题思路如下:
1、expression[1] 即是第一个问号 ‘?’,往右遍历,直到找到最后一个冒号 ‘:’,假设 j 位置是最后一个冒号,那么此时 expression[0] 如果为 T,则结果取决于 [2, j-1],即冒号前面的;如果为 F,则结果为 [j+1, length-1],即冒号后面的;
2、如果为 T,递归求解 expression 的 [2, j-1];反之递归求解 [j+1, length-1]。
3、解题代码
/**
* Java 实现
**/
class Solution {
public String parseTernary(String expression) {
int n = expression.length();
int checkLevel = 0;
for (int j = 1; j < n; j++) {
if (expression.charAt(j) == '?') checkLevel++;
if (expression.charAt(j) == ':') checkLevel--;
if (checkLevel == 0) {
return (expression.charAt(0) == 'T') ?
parseTernary(expression.substring(2, j)) :
parseTernary(expression.substring(j+1, n));
}
}
return expression;
}
}
/**
* C 实现
**/
char *parseTernary(char *expression)
{
char checkLevel = 0;
char str1[10000] = "";
//将?和:进行配对,当个数匹配时,进行递归计算
for (int i = 1; i < strlen(expression); i++)
{
if (expression[i] == '?')
{
checkLevel++;
} else if (expression[i] == ':')
{
checkLevel--;
}
if (checkLevel == 0)
{
//取 ':' 左半部分表达式进行递归计算
if (expression[0] == 'T')
{
strncpy(str1,&expression[2], i-2);
return parseTernary(str1);
} else {//取 ':' 右半部分表达式进行递归计算
strncpy(str1,&expression[i+1], strlen(expression)-i-1);
return parseTernary(str1);
}
}
}
return expression;
}