题解 | 吐泡泡
吐泡泡
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,需要爆炸。