- 为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。
- 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。
- 输入压缩后的报文:
- 1)不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;
- 2)原始报文不包含数字,所有的数字只表示重复的次数 n,例如不会出现像 5b 或 3[8] 的输入;
- 输出描述:
- 解压后的原始报文
- 示例1 输入 3[k]2[mn] 输出 kkkmnmn
- 说明 k 重复3次,mn 重复2次,最终得到 kkkmnmn
- 示例2 输入 3[m2[c]] 输出 mccmccmcc
- 说明
- m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc”
package q31toq40;
import java.util.Stack;
public class Question39 {
public static void main(String[] args) {
String str = "3[m2[c]]";
System.out.println(answer(str));
}
public static String answer(String str) {
char[] chars = str.toCharArray();
//一个栈存放数据,另一个栈临时存放,进行过渡(stack是后进先出,要先转换为正常的顺序然后再拼串
Stack<Object> stack1 = new Stack<>();
Stack<Object> stack2 = new Stack<>();
for (int i = 0; i < chars.length; i++) {
//如果是数字,需要判断接下来的字符是不是数字,如果是,要进行拼接
if (chars[i] - 48 >= 0 && chars[i] - 48 < 10) {
StringBuilder temp = new StringBuilder("" + chars[i]);
for (int j = i + 1; j < chars.length; j++) {
if (chars[j] - 48 >= 0 && chars[j] - 48 < 10) {
temp.append(chars[j]);
} else {
i = j - 1;
stack1.add(Integer.parseInt(temp.toString()));
break;
}
}
} else if (chars[i] != ']') {
stack1.add(chars[i]);
} else {
//遇到’]',形成闭环,将 [ ] 之间的字符拼串,然后按 [ 前方的数字拼接
while (!stack1.peek().equals('[')) {
stack2.add(stack1.pop());
}
stack1.pop();
int nums = Integer.parseInt("" + stack1.pop());
StringBuilder temp = new StringBuilder();
while (!stack2.isEmpty()) {
temp.append(stack2.pop());
}
String paste = temp.toString();
while (nums-- > 1) {
temp.append(paste);
}
stack1.push(temp);
}
}
//拼串
StringBuilder result = new StringBuilder();
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
while (!stack2.isEmpty()) {
result.append(stack2.pop());
}
return result.toString();
}
}