华为OD b卷 200分题目 评论转换输出

考试的时候想用递归,没递归出来,考完又想了想,直接循环 + 栈搞定了

子评论个数不为零就把子评论数入栈,同时Level+1,出栈时需要注意可能一次减少不止一个Level

考完写的代码,不保证通过,只通过了测试用例,仅供参考

public class Test {

  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

//    String line = in.nextLine();
//    String line = "hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0";
    String line = "A,3,B,2,C,0,D,1,E,0,F,1,G,0,H,1,I,1,J,0,K,1,L,0,M,2,N,0,0,1,P,0";
    String[] split = line.split(",");

    String[] strArr = new String[split.length / 2];
    int[] intArr = new int[split.length / 2];

    for (int i = 0; i < split.length / 2; i++) {
      strArr[i] = split[i * 2];
      intArr[i] = Integer.valueOf(split[i * 2 + 1]);
    }

    // 按层级放入list
    List<List<String>> list = new ArrayList<>();

    int level = 0;
    Stack<Integer> stack = new Stack<>();

    for (int i = 0; i < strArr.length; i++) {
      if (level + 1 > list.size()) {
        list.add(new ArrayList<>());
      }
      list.get(level).add(strArr[i]);

      if (stack.size() > 0) {
        int pop = stack.pop();
        pop--;
        stack.push(pop);
      }

      if (intArr[i] == 0) {
        int peek = stack.size() > 0 ? stack.peek() : -1;
        while (peek == 0 && stack.size() > 0) {
          stack.pop();
          level--;
          peek = stack.size() > 0 ? stack.peek() : -1;
        }
      } else {
        stack.push(intArr[i]);
        level++;
      }
    }

    System.out.println(list.size());
    for (int i = 0; i < list.size(); i++) {
      for (int j = 0; j < list.get(i).size(); j++) {
        System.out.print(list.get(i).get(j) + " ");
      }
      System.out.println();
    }

  }


}
#华为机试##华为OD#
全部评论

相关推荐

04-18 15:58
已编辑
门头沟学院 设计
kaoyu:这一看就不是计算机的,怎么还有个排斥洗碗?
点赞 评论 收藏
分享
评论
1
7
分享

创作者周榜

更多
牛客网
牛客企业服务