解压报文

  • 为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。
  • 压缩规则: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();
    }
}

全部评论

相关推荐

评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务