题解 | 吐泡泡
吐泡泡
https://www.nowcoder.com/practice/f86fa2221c094b3d8d1fc79bae450d96
import java.util.Scanner;
import java.util.Stack;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
char[] bubbles = in.nextLine().toCharArray();
Stack<Character> stack = new Stack<Character>();
for (Character ch : bubbles) {
if (stack.isEmpty()) { //栈为空直接push进ch
stack.push(ch);
} else if (stack.peek() != ch) { // 栈顶与ch不一样,直接push进ch
stack.push(ch);
} else { // 栈顶与ch一样,全为O或者全为o
if (stack.peek() == 'O') { // 如果全为O
stack.pop(); // 两个O直接爆炸,pop栈顶O即可
} else { // 全为o,分情况讨论
char currentBubble = stack.pop();// 先把这个o拿出来存着
if (!stack.isEmpty()) { // 如果拿了这个o后栈不为空,即这个拿出来的o前面还有元素
char previousBubble = stack.pop();
if (previousBubble == 'O') { // 如果这个前面的元素是O
continue; // 那么ch将与currentBubble合成O,这个合成的O将与previousBubble即O一起爆炸,所以什么都不做
} else { // 如果这个前面的元素是o
stack.push(previousBubble); // 将拿出来的previousBubble即o再push回去
stack.push('O');// ch将与currentcurrentBubble合成O,o与O不会爆炸,所以push进这个O
}
} else { // 如果拿了这个o后栈为空了,那么两个o直接合成O,push进栈即可
stack.push('O');
}
}
}
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
System.out.println(sb.reverse().toString());
}
}
}
注意栈顶为小o,下一个ch也是小o时的情况,两个小o合成大O,如果此时前面还是大O,需要爆炸。
查看20道真题和解析