当前位置: 首页 > article >正文

【华为OD题库-049】评论转换输出-java

题目

在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。评论具有树状结构,除了根评论外,每个评论都有一个父评论。
当评论保存时,使用以下格式:
首先是评论的内容;
然后是回复当前评论的数量。
最后是当前评论的所有子评论。(子评论使用相同的格式嵌套存储)
例如:
第—条评论是"hello,2,ok,0,bye,0" ,
第二条评论是"test,0" ,
第三条评论是"one,1 ,two,1,a,0"
所有评论被保存成"hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0"。对于上述格式的评论,请以另外—种格式打印:
首先打印评论嵌套的最大深度。
然后是打印n行,第(1<=i<=n)行对应于嵌套级别为i的评论(根评论的嵌套级别为1)。按照它们出现的顺序打印,用空格分隔开。
输入描述:
1行评论。由英文字母、数字和英文逗号组成。保证每个评论都是由英文字符组成的非空字符串。每个评论的数量都是整数(至少由一个数字组成)。整个字符串的长度不超过106.给定的评论结构保证是合法的。
输出描述
按照给定的格式打印评论。对于每一级嵌套,评论应该按照输入中的顺序打印
示例1
输入:
hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0
输出:
3
hello test one
ok bye two
a
说明:
如下图所示,最大嵌套级别为3。嵌套级别为1的评论是"hello test one”,嵌套级别为2的评论是"ok bye two",嵌套级别为3的评论为"a"。
在这里插入图片描述
示例2
输入:
A,5,A,0,a,0,A,0,a,0,A,0
输出:
2
A
A a A a A
说明:
如下图所示,最大嵌套级别为2,嵌套级别为1的评论是"A",嵌套级别为2的评论是"A a A a A"
在这里插入图片描述
示例3
输入:
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,O,1,P,0
输出:
4
A K M
B F H L N O
C D G I P
E J
说明: 如下图所示。
在这里插入图片描述
在这里插入图片描述

思路

这道题还是有难度,对递归不太好想

  1. 首先将字符串以逗号分割,得到字符数组arrs,
  2. 将arrs转为两个子数组,分别存放字符串和数字,以chars,nums表示
  3. 考虑设计递归函数,从题目中可以提取两个关键变量:遍历arrs的索引idx(和chars,nums中的idx/2位置对应),以及当前层级level。其中索引是从0到arrs.length-1,level可能在回溯中会在0,1,2,3,4…这些数反复出现,所以可以将level设计到递归函数里面,将idx放到最外层的静态变量。即,递归函数的形式为:dfs(level,chars,nums)
  4. 对于dfs里面,应该先将当前位置的值chars[idx/2]存入当前level的结果中,然后根据nums[idx/2]判断当前有几个子评论,循环调用dfs函数,这时的level应该是当前level+1,即:dfs(level+1,chars,nums)。如果nums[idx/2]=0,那么就是递归调用0次,也就结束了当前递归
  5. 每次确定存放了一个level的结果后,idx要加2,即idx始终会变大,判断子评论数量用的是nums[idx/2],为了避免idx变大对子评论数量的影响,应该先将值存下来用于for循环,再将idx增大。
  6. 最后将结果存入List < String > res中即可,level为0则存放0位置,level为1则存放1位置。因为根据实际,肯定是先有0位置,才有1位置(输入是先有父评论,再有子评论),比如res中已经存放了2级评论,当出现3级评论时,此时在res中找不到2的索引,但是res的size一定为2(已经存放过1级和2级评论),因此可以直接把此时结果存入res,存入后res最后一位的索引就为2,即代表3级评论。

题解

package hwod;

import java.util.*;

public class CommentInput {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        List<String> res = commentInput(str);
        System.out.println(res.size());
        for (int i = 0; i < res.size(); i++) {
            System.out.println(res.get(i));
        }

    }

    private static List<String> res = new ArrayList<>();

    private static int idx = 0;

    private static List<String> commentInput(String str) {
        //将字符串分割为字符串和数字两部分
        String[] arrs = str.split(",");
        String[] chars = new String[arrs.length / 2];
        int[] nums = new int[arrs.length / 2];
        for (int i = 0; i < chars.length; i++) {
            chars[i] = arrs[i * 2];
            nums[i] = Integer.parseInt(arrs[2 * i + 1]);
        }
        int level = 0;
        while (idx != arrs.length) {
            dfs(level, chars, nums);
        }
        return res;
    }

    private static void dfs(int level, String[] chars, int[] nums) {
        if (res.size() > level) {
            res.set(level, res.get(level) + " " + chars[idx / 2]);
        } else {
            res.add(chars[idx / 2]);
        }
        int num = nums[idx / 2];
        idx += 2;
        for (int i = 0; i < num; i++) {
            dfs(level + 1, chars, nums);
        }

    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.kler.cn/a/155794.html

相关文章:

  • 机器学习——贝叶斯
  • 5G时代的关键元件:射频微波MLCCs市场前景广阔
  • Python标准库模块的使用:math、datetime
  • Chromium 中MemoryMappedFile使用例子c++
  • docker运行ActiveMQ-Artemis
  • 5G 现网信令参数学习(3) - RrcSetup(1)
  • Android 13.0 Camera2 静音时拍照去掉快门声音
  • 条款2:不要滥用宏
  • 【Linux服务器Java环境搭建】05 Node JS安装及环境变量配置
  • 【数据库】基于封锁的数据库调度器,以及等待锁处理的优先级策略
  • 电磁兼容EMC理论基础汇总
  • ubuntu 下载编译 opencv4.2.0并检验
  • 详细学习Pyqt5的10种容器(Containers)
  • STM32 SCF文件
  • 有什么值得推荐的node. js练手项目吗?
  • Redis 数据结构详解
  • 共享智能指针shared_ptr
  • windows 映射 webdav 为本地磁盘
  • ChatGPT 的 18 种玩法,你还不会用吗?
  • 31-WEB漏洞-文件操作之文件包含漏洞全解
  • 前端下拉框select标签的插件——select2.js
  • Python与GPU编程快速入门(二)
  • springboot centos集成 OpenOffice 实现 在线预览 doc excel docx 成pdf的 并且包含中文包和英文包和安装
  • WPF MVVM模式下如何将UI窗口变量传参到Viewmodel层
  • 【Web安全】拿到phpMyAdmin如何获取权限
  • mysql面试题——日志与MVCC