2019年秋招猿辅导笔试编程题解析字符串

猿辅导笔试

编程题的解析字符串

5
A11B
(AA)2A
((A2B)2)2G
(YUANFUDAO)2JIAYOU
A2BC4D2

输入如上,按照规则解析字符串
研究了下用栈写出来了,其实不难,加上笔试时间,和复杂的边界条件,程序就很难跑的完全通。
如果有好的递归写法,欢迎分享下

public class Main {
  public static void main(String[] args) {
    decodeString("A11B");
    decodeString("(AA)2A");
    decodeString("((A2B)2)2G");
    decodeString("(YUANFUDAO)2JIAYOU");
    decodeString("A2BC4D2");
  }

  public static String decodeString(String s) {
    Stack<String> stack = new Stack();
    for (int i = 0; i < s.length(); i++) {
      if (s.charAt(i) == ')') {
        String str = "";
        while (!stack.peek().equals("(")) {
          str = stack.pop() + str;
        }
        stack.pop();
        String num = "";
        int w = 0;
        while (s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {
          w++;
          num = s.charAt(i + 1) + num;
          i++;
        }
        i = i - w + 1;
        int repeat = Integer.parseInt(num);
        String ret = "";
        for (int j = 0; j < repeat; j++) {
          ret = ret + str;
        }
        stack.push(ret);

      } else if (i + 1 > s.length() - 1 || s.charAt(i + 1) < '0' || s.charAt(i + 1) > '9') {

        String str = "";
        stack.push(s.charAt(i) + str);
      } else {
        int index = i;
        String num = "";

        while ((i + 1) <= s.length() - 1 && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {

          num = s.charAt(i + 1) + num;
          i++;
        }

        int nums = Integer.parseInt(num);
        String ret = "";
        for (int k = 0; k < nums; k++) {
          ret = s.charAt(index) + ret;
        }
        stack.push(ret);
        if (i + 1 >= s.length()) {
          break;
        }
      }
    }

    String result = "";
    while (!stack.isEmpty()) {
      result = stack.pop() + result;
    }
    System.out.println(result);
    return result;
  }
}

输出如下

AAAAAAAAAAAB
AAAAA
AABAABAABAABG
YUANFUDAOYUANFUDAOJIAYOU
AABCCCCDD
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值