华为OD机考算法题:评论转换输出

news2025/3/14 0:23:16

题目部分

题目评论转换输出
难度
题目说明在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。评论具有树状结构,除了根评论外,每个评论都有一个父评论。当评论保存时,使用以下格式:
首先是评论的内容;
然后是回复当前评论的数量;
最后是当前评论的所有子评论。(子评论使用相同的格式嵌套存储)
所有元素之间都用单个逗号分隔。
例如,如果评论如下:


第一条评论是 "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行,第 i (1 ≤ i ≤ n)行对应于嵌套级别为 i 的评论(根评论的嵌套级别为 1 )。
对于第i行,嵌套级别为的评论按照它们出现的顺序打印,用空格分隔开。
输入描述一行评论。由英文字母、数字和英文逗号组成。
保证每个评论都是由英文字符组成的非空字符串。
每个评论的数量都是整数(至少由一个数字组成)。
整个字符串的长度不超过10^{6}
给定的评论结构保证是合法的。
输出描述按照给定的格式打印评论。对于每一级嵌套,评论应该按照输入中的顺序打印。
补充说明
------------------------------------------------------
示例
示例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,1,1,J,0,K,1,L,0,M,2,N,0,0,1,P,0
输出4
A K M
B F H L N O
C D G I P
E J
说明如下图所示。

 


解读与分析

题目解读

输入一段字符串,根据给定的规则把它转换成另外的格式输出。

分析与思路

此题可以使用递归的思路实现。时间复杂度和空间复杂度均为 O(n)。


代码实现

Java代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 评论转换输出
 * 
 * @since 2023.10.18
 * @version 0.1
 * @author Frank
 *
 */
public class CommentsTransfer {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String input = sc.nextLine();
			String[] inputStr = input.split(",");
			int count = inputStr.length / 2;
			String[] contents = new String[count];
			int[] childrenCnt = new int[count];
			for (int i = 0; i < count; i++) {
				contents[i] = inputStr[2 * i];
				childrenCnt[i] = Integer.parseInt(inputStr[2 * i + 1]);
			}
			processCommentsTransfer(contents, childrenCnt);
		}
	}

	private static void processCommentsTransfer(String[] contents, int[] childrenCnt) {
		List<List<String>> commentsList = new ArrayList<List<String>>();
		int curLevel = 0;
		int curIndex = 0;
		while (curIndex <= contents.length - 1) {
			curIndex = processEachLevel(curIndex, curLevel, commentsList, contents, childrenCnt);
		}
		System.out.println( commentsList.size() );
		for( int i = 0; i < commentsList.size(); i ++ )
		{
			List<String> comments = commentsList.get( i );
			for( int j = 0; j < comments.size(); j ++ )
			{
				System.out.print( comments.get( j ));
				if( j < comments.size() - 1 )
				{
					System.out.print( "," );
				}else
				{
					System.out.println();
				}
			}
		}
	}

	private static int processEachLevel(int curIndex, int curLevel, List<List<String>> commentsList, String[] contents,
			int[] childrenValues) {
		int index = curIndex;
		
		List<String> comments;
		if( curLevel >= commentsList.size() )
		{
			comments = new ArrayList<String>();
			commentsList.add( comments );
		}else
		{
			comments = commentsList.get( curLevel );
		}
		
		int curChildrenCnt = childrenValues[ curIndex ];
		
		comments.add( contents[index] );
		index ++;
		
		if( curChildrenCnt == 0 )
		{
			return index;
		}
		// 有children的情况
		for( int i = 0; i < curChildrenCnt; i ++ )
		{			
			index = processEachLevel( index, curLevel + 1, commentsList, contents, childrenValues);
		}
		return index;
	}
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        var inputArr = line.split(",");
        var count = inputArr.length / 2;
        var contents = new Array();
        for (var i = 0; i < count; i++) {
            var eachContent = new Array();
            eachContent[0] = inputArr[2 * i];
            eachContent[1] = parseInt(inputArr[2 * i + 1]);
            contents[i] = eachContent;
        }
        processCommentsTransfer(contents);
    }
}();

function processCommentsTransfer(contents) {
    var commentsList = new Array();
    var curLevel = 0;
    var curIndex = 0;
    while (curIndex <= contents.length - 1) {
        curIndex = processEachLevel(curIndex, curLevel, commentsList, contents);
    }

    console.log(commentsList.length);
    for (var i = 0; i < commentsList.length; i++) {
        var outputStr = "";
        var comments = commentsList[i];
        for (var j = 0; j < comments.length; j++) {
            outputStr += comments[j];
            if (j < comments.length - 1) {
                outputStr += ",";
            }
        }
        console.log(outputStr);
    }
}

function processEachLevel(curIndex, curLevel, commentsList, contents) {
    var index = curIndex;

    var comments;
    if (curLevel >= commentsList.length) {
        comments = new Array();
        commentsList.push(comments);
    } else {
        comments = commentsList[curLevel];
    }

    var curChildrenCnt = contents[index][1];

    comments.push(contents[index][0]);
    index++;

    if (curChildrenCnt == 0) {
        return index;
    }
    // 有children的情况
    for (var i = 0; i < curChildrenCnt; i++) {
        index = processEachLevel(index, curLevel + 1, commentsList, contents);
    }
    return index;
}

(完)

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

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

相关文章

24届好未来数开笔试

目录 选择、多选SQL题目描述输入 目标解答解析 题目分享 选择、多选 Java, int x 1, float y 2, x/y 0.5 2. Hive 的数据结构 基本数据类型 复合数据类型 text 不是 Hive 内外表 建表时如果不显示声明表的类型为 外表 Kafka 通过&#xff08;&#xff09;避免任务重复执行…

利用QT通过http协议,来实现上传文件功能

#假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# 大体上的软件界面如下&#xff1a; 主要阐述一哈写的这个软件实现的功能&#xff1a; 通过名称找到指定的文件&#xff0c;并且将文件按照后缀名的格式进行分开&#xff0c;最后再将所有找到的文件&#xff0c;进…

Vue3-属性绑定、定时任务

1.Vue3-属性绑定 2.定时任务 1.Vue3-属性绑定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- vue.js --><script src"https://unpkg.com/vue3/dist/vue.gl…

android开源投屏工具scrcpy简介

目录 一&#xff0c;初识scrcpy 1.1 scrcpy介绍 1.2 scrcpy特点 二&#xff0c;scrcpy指令说明 2.1 画面设置 2.1.1 缩小分辨率 2.1.2 修改画面比特率 2.1.3 限制画面帧率 2.1.4 画面裁剪 2.1.5 锁定屏幕朝向 2.2 屏幕录制 2.3 连接方式 2.3.1 无线 2.3.2 多设备…

云计算:掌控未来,一触即发!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

Systrace学习笔记

Systrace学习笔记 1.Systrace快捷键2.线程状态3.CPU info4.图形化4.1 Frames帧4.2 用户活动4.3 CPU活动4.4 系统事件 5. SystemServer5.1 SystemServer简介5.2 窗口动画5.3 AMS(ActivityManagerService)5.4 WMS(WindowMagerService)5.5 ServiceThread5.6 HandlerThread 6. Surf…

软考-网络安全体系与网络安全模型

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 网络安全体系相关安全模型 BLP机密性模型 BLP&#xff08;Biba-格雷泽-麦克拉伦&#x…

安装Elasticsearch步骤(包含遇到的问题及解决方案)

注&#xff1a;笔者是在centos云服务器环境下安装的Elasticsearch 目录 1.安装前准备 2.下载Elasticsearch 3.启动Elasticsearch 非常容易出问题 第一次运行时&#xff0c;可能出现如下错误&#xff1a; 一、内存不足原因启动失败 二、使用root用户启动问题 三、启动ES自…

【数据仓库】hadoop生态圈与数据仓库

文章目录 1.大数据定义2. Hadoop与数据仓库3. 关系数据库的可扩展性瓶颈4. CAP理论5. Hadoop数据仓库工具5.1. RDS和TDS5.2. 抽取过程5.3. 转换与装载过程5.4. 过程管理和自动化调度5.5&#xff0e;数据目录&#xff08;或者称为元数据管理&#xff09;5.6&#xff0e;查询引擎…

ELK + Filebeat 分布式日志管理平台部署

ELK Filebeat 分布式日志管理平台部署 1、前言1.1日志分析的作用1.2需要收集的日志1.3完整日志系统的基本特征 2、ELK概述2.1ELK简介2.2为什么要用ELK?2.3ELK的组件 3、ELK组件详解3.1Logstash3.1.1简介3.1.2Logstash命令常用选项3.1.3Logstash 的输入和输出流3.1.4Logstash配…

Tengine 边缘AI计算框架移植RV1126(包括opencv的交叉编译)

目录 1.编译opencv 2.拷贝SDK源码到虚拟机 3. 拉取TIM-VX代码 4.拉取Tengine源码并配置 1.编译opencv 编译opencv是为了&#xff0c;在编译Tengine时指定OpenCVConfig.cmake,以便寻找特定的opencv动态库 01.从github拉取opencv源代码 git clone -b 4.5.5 https://github.co…

unity 浏览器插件【embedded browser(原zfbrowser)】简单教程,使unity支持web h5页面,附软件下载链接

一 简介 这是个在项目中使用了很久的浏览器插件。 很负责任的说这是在pc平台上最好用的浏览器插件 商业付费价格78刀&#xff0c;相比3d webview等插件动不动就178、368的价格就显得很良心 最新版下载链接&#xff08;请勿商用&#xff09; 1.1 功能概述 基本和普通浏览器无…

基于Scrapyd与Gerapy部署scrapy爬虫方案【可用于分布式爬虫部署】

scrapyd部署爬虫 Scrapyd 是一个基于 Scrapy 的开源项目&#xff0c;它提供了一个简单的方式来部署、运行和监控 Scrapy 爬虫。它是一个用于集成 Scrapy 爬虫到分布式架构中的工具&#xff0c;允许您在分布式环境中运行爬虫&#xff0c;并提供了一组 Web API&#xff0c;用于管…

软考高级系统架构设计师系列之:数学与经济管理

软考高级系统架构设计师系列之:数学与经济管理 一、数学与经济管理二、图论应用-最小生成树三、图论应用-最短路径四、图论应用-网络与最大流量五、运筹方法-线性规划六、运筹方法-动态规划七、运筹方法-转移矩阵八、运筹方法-排队论九、运筹方法-决策-不确定决策十、运筹方法…

携手北大医学部、哈佛BCH顶尖平台,飞鹤全面启动脑发育战略

10月17日&#xff0c;“专研大脑营养 聪明中国宝宝”飞鹤脑发育战略发布会在北京举办。会上&#xff0c;中国飞鹤宣布启动脑发育战略。诺奖得主迈克尔莱维特、中国工程院院士朱蓓薇、中国工程院院士陈卫、北京大学神经科学研究所副所长邢国刚等海内外专家齐聚&#xff0c;共同探…

Redis数据结构之listpack

前言 当数据量较小时&#xff0c;Redis 会优先考虑用 ziplist 来存储 hash、list、zset&#xff0c;这么做可以有效的节省内存空间&#xff0c;因为 ziplist 是一块连续的内存空间&#xff0c;它采用一种紧凑的方式来存储元素。但是它也有缺点&#xff0c;比如查找的时间复杂度…

Unity2023, Unity2022, Unity2021的性能对比(帧率)

最近由于需要用到Unity最新版的一些功能&#xff0c;比如Spline&#xff0c;比如Foward渲染&#xff0c;新项目用了Unity2022.3.5版本&#xff0c;但是出包之后&#xff0c;感觉帧率很低。本着好奇的态度&#xff0c;专门写了一个测试场景&#xff0c;分别在Unity2023.1.15&…

激光跟踪仪在风电行业中的应用

随着全球能源行业重点从化石能源向可再生能源转移&#xff0c;风电行业逐渐成为我国能源供应体系的重要分支&#xff0c;相关的风电检测设备需求量急剧增加。 风电设备主要特点是“重、大”&#xff0c;在过去&#xff0c;主要使用大型卡尺、两点式仪表、专用模板等量具对重要尺…

PS运行中缺失d3dcompiler_47.dll问题的5个有效修复方法总结

在使用ps作图的时候&#xff0c;我们有时会遇到一些问题&#xff0c;其中之一就是“PS运行中缺失d3dcompiler_47.dll”的问题。这个问题可能会导致PS无法正常运行&#xff0c;“d3dcompiler_47.dll”。这是一个动态链接库文件&#xff0c;它是DirectX的一部分&#xff0c;主要负…

Docker仓库harbor私服搭建

Harbor和Registry都是Docker的镜像仓库&#xff0c;但是Harbor作为更多企业的选择&#xff0c;是因为相比较于Regisrty来说&#xff0c;它具有很多的优势。 提供分层传输机制&#xff0c;优化网络传输 Docker镜像是是分层的&#xff0c;而如果每次传输都使用全量文件(所以用FT…