思路:
递归分解的思路很简单,但每次都要遍历整个string看?对应的:在哪里,因此可以先一边遍历一边使用栈记录问号?对应的分号:在哪里,这样就减少了每次遍历。
输入:“T?2:3”
输出:“2”
输入: “F?1:T?4:5”
输出: “4”
输入:″T?T?F:5:3″
输出: “F”
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
System.out.println(calcExpress(line));
}
private static String calcExpress(String line) {
int[] semicolonIndexes = new int[line.length()];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < line.length(); i++) {
char ch = line.charAt(i);
if (ch == '?') {
stack.push(i);
} else if (ch == ':') {
int questionMarkIndex = stack.pop();
semicolonIndexes[questionMarkIndex] = i;
} else {
continue;
}
}
return calcExpress(line, semicolonIndexes, 0, line.length());
}
private static String calcExpress(String line, int[] semicolonIndexes, int start, int end) {
if (end - start == 1) {
return line.substring(start, end);
}
for (int i = start; i < end; i++) {
char ch = line.charAt(i);
if (ch == '?') {
int semicolonIndex = semicolonIndexes[i];
return line.charAt(i - 1) == 'T' ? calcExpress(line, semicolonIndexes, i + 1,
semicolonIndex) : calcExpress(line, semicolonIndexes, semicolonIndex + 1, end);
}
}
return "impossible result";
}
网友评论