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

news2024/10/7 3:25:06

题目

在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。评论具有树状结构,除了根评论外,每个评论都有一个父评论。
当评论保存时,使用以下格式:
首先是评论的内容;
然后是回复当前评论的数量。
最后是当前评论的所有子评论。(子评论使用相同的格式嵌套存储)
例如:
第—条评论是"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.coloradmin.cn/o/1270855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elment Loading 加载组件动态变更 text 值bug记录

先上效果图: 倒计时4分钟组件方法 // 倒计时 4分钟getSencond() {this.countDown 4分00秒this.interval setInterval(() > {this.maxTime--;let minutes Math.floor(this.maxTime / 60);let seconds Math.floor(this.maxTime % 60);minutes minutes < 10 ? 0 minu…

Linux系统编程--文件操作函数

一.常见IO函数 fopen fclose fread fwrite fseek fflush fopen 运行过程 &#xff1a;打开文件 写入数据 数据写到缓冲区 关闭文件后 将数据刷新入磁盘 1.fopen 返回文件类型的结构体的指针 包括三部分 1).文件描述符&#xff08;整形值 索引到磁盘文件&#xff09;…

11.29 C++ 作业

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <io…

windows 查看mysql的错误日志

查找错误日志文件存储路径 用到的软件&#xff1a;everything 官网 voidtools 下载路径 https://www.voidtools.com/Everything-1.4.1.1024.x64-Setup.exe 直接点击下载即可 运行效果如下 我们知道mysql有个配置文件是my.ini&#xff0c;里面配置了相关信息 我们需要先…

Docker—更新应用程序

在本部分中&#xff0c;你将更新应用程序和映像。您还将了解如何停止和移除容器。 一、更新源代码 在以下步骤中&#xff0c;当您没有任何待办事项列表项时&#xff0c;您将把“空文本”更改为“您还没有待办事项&#xff01;在上面添加一个&#xff01;” 1、在src/static/…

UG\NX二次开发 创建对象属性UF_ATTR_assign

文章作者:里海 来源网站:里海NX二次开发3000例专栏 感谢粉丝订阅 感谢 weixin_43890371 订阅本专栏,非常感谢。 简介 创建对象属性UF_ATTR_assign 这个函数在后续NX版本中被UF_ATTR_set_user_attribute替代,新的函数使用例子请参阅这篇文章《UG\NX二次开发 创建对象属性UF_…

自学MySql(一)

1.安装下载 下载网址 2、将mysql的bin目录添加到环境变量&#xff08;可选&#xff09; 3、使用一下命令测试

二叉树层次遍历通用模板公式

二叉树的基本结构 #include<iostream>using namespace std;struct TreeNode {/* data */int val;TreeNode* left;TreeNode* right;TreeNode() {}TreeNode(int x) : left(nullptr), right(nullptr), val(x) {} };力扣&#xff08;LeetCode&#xff09;官网 - 全球…

SpringBoot项目打成jar包后,上传的静态资源(图片等)如何存储和访问

1.问题描述&#xff1a; 使用springboot开发一个项目&#xff0c;开发文件上传的时候&#xff0c;通常会将上传的文件存储到资源目录下的static里面&#xff0c;然后在本地测试上传文件功能没有问题&#xff0c;但是将项目打成jar包放到服务器上运行的时候就会报错&#xff0c…

QT学习_16_制作软件安装包

1、准备软件exe及其运行环境 参考&#xff1a;Qt学习_12_一键生成安装包_江湖上都叫我秋博的博客-CSDN博客 这篇博客记录了&#xff0c;如何用window的脚本&#xff0c;一键生成一个可以免安装的软件压缩包&#xff0c;解压缩后&#xff0c;点击exe文件就可以直接运行。 这一…

基于APM(PIX)飞控和missionplanner制作遥控无人车-从零搭建自主pix无人车无人履带车坦克-2(以乐迪crossflight飞控为例)

这里重点以乐迪crossflight飞控为例进行组装调试。 1.刷写固件 安装最新版的乐迪地面站&#xff0c;在官网可以下载。由于产品里面不好找到对应的飞控&#xff0c;可以在首页滑动图片里进入。 1.连接飞控和电脑&#xff0c;查看com口&#xff0c;安装驱动。 2.刷写固件。如果…

【腾讯云 HAI域探秘】借助高性能应用HAI——我也能使用【stable diffusion】制作高级视频封面了

目录 高性能应用服务HAI_GPU云服务器的申请与服务创建 官网地址&#xff1a;高性能应用服务HAI_GPU云服务器_腾讯云 通过高性能应用服务HAI——创建【stable diffusion】 WebUI效果&#xff1a; 服务器后台效果&#xff1a; stable-diffusion服务测试 启动接口服务 配置…

MediaPipe - 小记

文章目录 关于 MediaPipe 关于 MediaPipe Cross-platform, customizable ML solutions for live and streaming media. MediaPipe &#xff1a; 设备端机器学习框架 MediaPipe Studio : 提供标准化 task&#xff0c;你可以下载预训练模型来使用 MediaPipe Model Maker : 定制…

nacos集群开箱搭建-linux版本搭建

原创/朱季谦 nacos是一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台&#xff0c;简单而言&#xff0c;它可以实现类似zookeeper做注册中心的功能&#xff0c;也就是可以在springcloud领域替代Eureka、consul等角色&#xff0c;同时&#xff0c;还可以充当spri…

毕业设计单片机可以用万能板吗?

毕业设计单片机可以用万能板吗? 可以是可以&#xff0c;就是焊接起来比较麻烦&#xff0c;特别是有好几个重复连线点的时候&#xff0c;检测起来就不那么容易了&#xff0c;而且布线看起来乱糟糟的&#xff0c;如果后期一不小心把线弄断了&#xff0c;查起来就更麻烦了&#x…

「Linux」进程等待与替换

&#x1f4bb;文章目录 &#x1f4c4;前言进程等待进程等待的概念进程等待的方法 进程替换进程替换的概念替换方式 &#x1f4d3;总结 &#x1f4c4;前言 在如今的时代&#xff0c;多进程编程已经变成了必不可少的一部分&#xff0c;而进程等待、进程替换这两个概念都是作为多进…

记一次:Python的学习笔记一

前言&#xff1a;之前学习的Python笔记&#xff0c;已经过去很多年了&#xff0c;不久前重新翻了出来练习练习。不完善的地方在缝缝补补 一、环境搭建 1.1、Python的win环境安装 0、python-3.12.0软件安装&#xff1a;Win11环境搭建python-3.12.0-amd64 这里小小注意一下&a…

Docker的基本概念和优势,以及在应用程序开发中的实际应用

文章目录 概要 基本概念 容器 (Container): 镜像 (Image): Dockerfile: 仓库 (Repository): 容器编排 (Orchestration): Docker Compose: Docker Daemon 和 Docker Client: 网络 (Network): 数据卷 (Volume): 主要优势 应用场景 小结 概要 Docker 是一种容器化平台&#xff0c;…

网易区块链,网易区块链赋能赣州脐橙数字藏品,数字指纹解决方案

目录 网易区块链 网易区块链赋能赣州脐橙数字藏品,助力革命老区三农之路 数字指纹解决方案 网易区块链 网易区块链成立于2017年,致力于Web3.0区块链技术的研发和应用。自主研发的区块链“天玄”引擎,在单链场景下支持每秒最高30万笔交易,单日可处理上链数据超10亿。 与…

最新AI智能写作回答系统源码 附完整的搭建教程

随着人工智能技术的快速发展&#xff0c;AI在各个领域的应用越来越广泛。在写作领域&#xff0c;AI智能写作回答系统已经成为一种新型的写作工具&#xff0c;可以帮助人们快速、准确地生成文章&#xff0c;提高写作效率和质量。 以下是部分代码的示例&#xff1a; 系统的特色功…