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

news/2024/7/20 17:29:20 标签: 华为od, 算法, 数据结构, Java, Javascript

题目部分

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


第一条评论是 "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.niftyadmin.cn/n/5098850.html

相关文章

点云从入门到精通技术详解100篇-基于点云数据的奶牛体型评定指标自动测量关键技术研究

目录 前言 国内外研究现状 奶牛体型评定现状 奶牛体型评定指标测量现状 存在问题分

【Java学习之道】指引篇:从入门到入世

引言 你是否曾为找不到适合自己的Java学习之路而烦恼&#xff1f;是否想摆脱混乱的Java知识体系&#xff0c;找到一条从入门到精通的捷径&#xff1f;来《Java学习之道》吧&#xff0c;本专栏为你量身打造&#xff0c;让我们一起轻松踏上Java学习之旅&#xff01; 第一章、Jav…

7.继承与多态 对象村的优质生活

7.1 民法亲属篇&#xff1a;继承&#xff08;inheritance&#xff09; 了解继承 在设计继承时&#xff0c;你会把共同的程序代码放在某个类中&#xff0c;然后告诉其他的类说此类是它们的父类。当某个类继承另一个类的时候&#xff0c;也就是子类继承自父类。以Java的方式说&…

云耀服务器L实例部署Typecho开源博客系统|华为云云耀云服务器L实例评测使用体验

云耀服务器L实例部署Typecho开源博客系统 文章目录 云耀服务器L实例部署Typecho开源博客系统1. 华为云云耀服务器L实例介绍2. Typecho2.1 Typecho 3. 部署华为云云耀服务器L实例3.1 云耀服务器L实例购买3.1.1 云耀服务器L实例初始化配置3.1.2 远程登录云耀服务器L实例 4. Typec…

PFL-MoE:基于混合专家的个性联邦学习

文章链接&#xff1a;PFL-MoE: Personalized Federated Learning Based on Mixture of Experts 发表会议&#xff1a;APWeb-WAIM 2021&#xff08;CCF-C&#xff09; 目录 1.背景介绍联邦学习non-IIDPFL 2.内容摘要关键技术A.PFL-MoEB.PFL-MFC.PFL-MFE 实验结果 3.文章总结 1.…

YAPI介绍及Docker Compose部署指南

我们团队的项目最初前后端是同一个开发人员在做&#xff0c;因此并不存在提供详细接口文档等问题。随着项目的不断迭代&#xff0c;团队规模逐渐扩大&#xff0c;我们决定将前后端分开&#xff0c;专门由专业的前端和后端人员进行开发工作。然而&#xff0c;这样的改变也带来了…

Kotlin中的选择结构语句

在 Kotlin 中&#xff0c;有几种选择结构语句可以根据条件执行不同的代码块。这些选择结构语句包括 if-else、when 表达式和三元操作符&#xff08;也称为三元表达式&#xff09;。 if-else 语句 if-else 语句是最基本的选择结构语句&#xff0c;在 Kotlin 中使用起来非常简单…

HugeGraph1.0.0部署,吐槽一下Hubble的数据导入 Bug

背景 HugeGraph 安装部署了最新版本1.0.0&#xff0c;发现它的 Web 工具 Hubble 有一个大 Bug。数据导入的时候&#xff0c;配置节点属性映射这个选项时&#xff0c;下拉框只有一个选项&#xff0c;但实际上&#xff0c;元数据配置中的属性有3个&#xff0c;这个 Bug 是怎么产…