【华为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),查看当前专栏更新的所有题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/215902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

05、pytest断言确定的异常

官方用例 # content of test_sysexit.py import pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()解读与实操 ​ 标准python raise函数可产生异常。pytest.raises可以断言某个异常会发现。异常发生了&#xff0c;用例执行成功&#x…

华为云云绘本第一期:童话奇迹原来是你

点此进入官网&#xff0c;专家1对1&#xff1a;应用身份管理服务OneAccess_华为云IDaaS-华为云

Python:核心知识点整理大全2-笔记

在本章中&#xff0c;你将学习可在Python程序中使用的各种数据&#xff0c;还将学 习如何将数据存储到变量中&#xff0c;以及如何在程序中使用这些变量。 2.1 运行 hello_world.py 时发生的情况 运行hello_world.py时&#xff0c;Python都做了些什么呢&#xff1f;下面来深入…

ArcGIS提取DEM中的山脉范围

已知数据&#xff1a;DEM文件ASTGTM_N00E118E.img 使用软件&#xff1a;ArcMap 要求&#xff1a;对数据进行操作&#xff0c;提取数据文件中的山脉范围 下面开始操作&#xff1a; 1、 打开ArcMap将DEM文件ASTGTM_N00E118E.img添加到数据框。 2、 接下来我们打开spatial ana…

三十七、XA模式

目录 一、XA模式原理 在XA模式中&#xff0c;一个事务通常被分为两个阶段&#xff1a; 二、Seata的XA模式 RM一阶段的工作&#xff1a; TC一阶段的工作&#xff1a; RM二阶段的工作&#xff1a; 1、优点&#xff1a; 2、缺点&#xff1a; 三、实现XA模式 1、修改yml文…

CYCA少儿形体礼仪 朝阳市培训成果考核圆满落幕

少年成长从形体教育开始——从2020年美育中考落地执行开始&#xff0c;美育成为少儿教育发展的必经之路&#xff0c;助力少儿综合能力全面发展。CYCA中国文化管理协会青少年文化艺术委员会全面贯彻党的教育方针&#xff0c;促进儿童素质艺术教育并深入实施&#xff0c;从少儿形…

12-2 Mybatis-Plus与Spring整合

user-springboot programming 实体类 ## 链接数据源 C3p0&#xff08;原始化&#xff09; 连接池的数据源 引入mysql 自动配置类DataSource会生效 需要你去配置相关的数据库参数 需要用到连接池 数据源的配置类 SpringBoot的测试类 SpringBootTest 原先是RunWith和Conf…

服务异步通讯

四、服务异步通讯 4.1初始MQ 4.1.1同步通讯和异步通讯 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: 耦合度高 性能和吞吐能力下降 有额外的资源消耗 有级联失败问题 异步通信的优点: 耦合度低 吞吐量提升 故障隔离 流量削峰 异步通信的缺点: …

智能优化算法应用:基于入侵杂草算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于入侵杂草算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于入侵杂草算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.入侵杂草算法4.实验参数设定5.算法结果6.参考…

双指针算法: 快乐数 与 盛水最多的容器

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 前言 声明…

前端漏洞--front(系统有user1/user1,admin1/admin1两个用户)

任务一&#xff1a;挖掘反射型XSS漏洞&#xff08;以弹窗test13&#xff09;证明 任务二&#xff1a;复现环境中的CSRF漏洞&#xff0c;设计表单&#xff0c;当管理员点击URL后自动将自己密码重置为&#xff1a;123456 任务三&#xff1a;复现环境中的JSON Hijacking漏洞&#…

开放式耳机怎么选?干货分享! 2023好评度超高开放式耳机推荐!

在现代社会中&#xff0c;人们对于音乐和通话的需求越来越高。传统的耳机虽然能够提供良好的音质&#xff0c;但使用过程中存在一些问题&#xff0c;例如长时间佩戴会引起耳朵疲劳和隔绝周围环境的声音。为了解决这些问题&#xff0c;开放式耳机应运而生&#xff0c;成为了一种…

解决webpack打包生成gz格式css/js文件没法在nginx使用的问题--全网唯一正确

本文绝对是全网解决这个问题唯一正确的文章&#xff0c;没有之一&#xff01; 很多人都说开启nginx gzip压缩&#xff0c;这些人完全是胡说八道&#xff01;你们到底懂不懂叫gzip压缩啊&#xff1f;&#xff01; 不信你就试试&#xff0c;如果css/js只有gz文件&#xff0c;ng…

数组逆序重放

数组逆序重放的意思是将数组的元素逆序排列&#xff0c;然后重新放回原数组中。这个操作可以在很多编程语言中实现&#xff0c;例如Python、Java等。 下面是一个Python的示例代码&#xff0c;可以实现这个操作&#xff1a; def reverse_and_rearrange(arr): # 反转数组 …

面试多线程八股文十问十答第二期

面试多线程八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.进程和线程的区别 概念不同&#xff1a;进程是操作系统中的一个独立执行单元&a…

Python搭建代理IP池实现接口设置与整体调度

目录 前言 1. 搭建免费代理IP爬虫 2. 将获取到的代理IP存储到数据库中 3. 构建一个代理IP池 4. 实现调度器来调度代理IP池 5. 实现带有代理IP池的爬虫 总结 前言 在网络爬虫中&#xff0c;代理IP池是一个非常重要的组件。由于许多网站对单个IP的请求有限制&#xff0c;…

Python练习题(三)

&#x1f4d1;前言 本文主要是【Python】——Python练习题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

学生犯错误老师应该怎么教育

作为一名老师&#xff0c;当学生犯错误时&#xff0c;我们需要采取一些措施来帮助他们改正错误并学习如何更好地处理问题。以下是我作为一名老师会采取的几个步骤&#xff1a; 进行私下谈话&#xff0c;了解他们为什么犯错误。我会听取他们的解释&#xff0c;并尝试理解他们的动…

如何能够对使用ShaderGraph开发的Shader使用SetTextureOffset和SetTextureScale方法

假设在ShaderGraph中的纹理的引用名称为"_BaseMap"&#xff0c;同时对这个"_BaseMap"纹理使用了采样的节点"SampleTexture2D"&#xff0c;然后该采样节点的uv接入的TilingAndOffset节点&#xff0c;此时的关键步骤是新建一个Vector4属性&#xf…

深入解析Linux内核网络-拥塞控制系列(一)

谈起网络拥塞控制&#xff0c;大家可能很熟悉八股文中的"加法增大“、”乘法减小“、”慢开始“、“拥塞避免”、“快重传”、“快恢复”等概念。没错&#xff0c;这是一种经典网络拥塞控制算法的基础理论&#xff0c;但在实际的实现时不同的拥塞控制算法&#xff0c;有很…