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

【华为OD-E卷 - 119 评论转换输出 100分(python、java、c++、js、c)】

【华为OD-E卷 - 评论转换输出 100分(python、java、c++、js、c)】

题目

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

在这里插入图片描述
第一条评论是"helo,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。

给定的评论结构保证是合法的

输出描述

  • 按照给定的格式打印评论。对于每一级嵌套,评论应该按照输入中的顺序打印

用例

用例一:
输入:
hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0
输出:
3
hello test one
ok bye two
a
用例二:
输入:
A,5,A,0,a,0,A,0,a,0,A,0
输出:
2
A
A a A a A
用例三:
输入:
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

python解法

  • 解题思路:
  • 该代码的目的是根据输入的字符串构建一棵多叉树,并按层级输出每层的节点。输入的字符串包含评论内容和每个评论的子评论数量。程序使用递归方法将评论及其子评论按层级组织到树结构中,并最终输出每一层的评论内容。

具体步骤如下:

输入处理:

输入的字符串通过逗号分隔,每个评论后面紧跟着一个数字,表示该评论的子评论数量。
例如输入 “A,2,B,0,C,1,D,0” 表示:
A 有 2 个子评论:B 和 C。
B 没有子评论。
C 有 1 个子评论:D。
D 没有子评论。
树的构建:

使用 tree 列表存储每一层的评论,tree[0] 为第一层评论,tree[1] 为第二层评论,以此类推。
使用 queue 队列来依次处理评论和子评论数量。
递归函数 recursive() 处理子评论,逐层递归构建树。
结果输出:

最终输出树的层数以及每一层的评论内容

def get_result(comments):
    tree = []  # 用于存储树的层级结构,每一层是一个列表
    queue = comments.split(",")  # 将输入的字符串按逗号分割,形成队列
    level = 1  # 初始化层级,从1开始

    # 处理队列中的评论
    while queue:
        comment = queue.pop(0)  # 取出当前评论

        if len(tree) < level:
            tree.append([])  # 如果当前层级不存在,初始化该层

        tree[0].append(comment)  # 将第一个评论加入第一层

        child_count = int(queue.pop(0))  # 取出当前评论的子评论数量

        # 递归处理子评论
        recursive(queue, level + 1, child_count, tree)

    print(len(tree))  # 输出树的层数
    for level_nodes in tree:
        print(" ".join(level_nodes))  # 输出每一层的评论内容


def recursive(queue, level, child_count, tree):
    """
    递归处理子评论
    :param queue: 剩余的评论队列
    :param level: 当前处理的层级
    :param child_count: 当前评论的子评论数量
    :param tree: 树的结构,按层级存储评论
    """
    for _ in range(child_count):
        comment = queue.pop(0)  # 取出子评论

        if len(tree) < level:
            tree.append([])  # 如果当前层级不存在,初始化该层

        tree[level - 1].append(comment)  # 将子评论加入对应的层级

        count = int(queue.pop(0))  # 取出当前子评论的子评论数量

        if count > 0:
            recursive(queue, level + 1, count, tree)  # 如果子评论还有子评论,继续递归


if __name__ == "__main__":
    comments = input()  # 输入评论字符串
    get_result(comments)

java解法

  • 解题思路
  • 该代码的目的是解析一串表示评论和子评论的字符串,构建一棵树状结构,并按层级输出每一层的评论内容。

核心思路:

输入格式:

输入是一串由逗号分隔的字符串,奇数位置表示评论内容,偶数位置表示该评论的子评论数量。
例如输入:“A,2,B,0,C,1,D,0” 表示:
A 有 2 个子评论:B 和 C。
B 没有子评论。
C 有 1 个子评论:D。
D 没有子评论。
树的构建:

使用 List<List> 数据结构表示树的层级,每一层是一个 List。
使用 Queue 处理输入数据,逐个解析评论及其子评论数量。
递归方法 buildTree 负责构建树的层级结构。
输出结果:

输出树的层数(即层级数)。
依次输出每一层的评论内容。

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

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String data = scanner.nextLine();  // 从控制台读取输入数据
        scanner.close();

        List<List<String>> tree = processComments(data);  // 处理输入数据,构建树结构
        outputResult(tree);  // 输出结果
    }

    /**
     * 处理输入的评论数据,构建树的层级结构
     * 
     * @param data 输入的字符串,包含评论和子评论数量
     * @return 树的层级结构,每一层是一个字符串列表
     */
    public static List<List<String>> processComments(String data) {
        List<List<String>> tree = new ArrayList<>();  // 存储树的层级结构
        Queue<String> queue = new LinkedList<>();  // 用于处理输入的队列

        // 将输入字符串按逗号分割,加入队列
        for (String part : data.split(",")) {
            queue.add(part);
        }

        // 当队列不为空时,继续构建树
        while (!queue.isEmpty()) {
            buildTree(queue, 1, tree);  // 从第1层开始构建
        }

        return tree;
    }

    /**
     * 递归构建树的层级结构
     * 
     * @param queue 输入数据的队列
     * @param level 当前处理的层级
     * @param tree 树的层级结构
     */
    private static void buildTree(Queue<String> queue, int level, List<List<String>> tree) {
        // 如果当前层级在树中不存在,初始化该层
        if (tree.size() < level) {
            tree.add(new ArrayList<>());
        }

        String comment = queue.poll();  // 取出当前评论
        tree.get(level - 1).add(comment);  // 将评论添加到对应层级

        int childrenCount = Integer.parseInt(queue.poll());  // 获取子评论数量

        // 递归处理子评论
        for (int i = 0; i < childrenCount; i++) {
            buildTree(queue, level + 1, tree);
        }
    }

    /**
     * 输出树的层级结果
     * 
     * @param tree 树的层级结构
     */
    public static void outputResult(List<List<String>> tree) {
        System.out.println(tree.size());  // 输出层数
        for (List<String> levelComments : tree) {
            System.out.println(String.join(" ", levelComments));  // 输出每层的评论内容
        }
    }
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏


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

相关文章:

  • 本地部署DeepSeek Nodejs版
  • 从MySQL优化到脑力健康:技术人与效率的双重提升
  • VMware Workstation创建虚拟机
  • Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)
  • 手写一个C++ Android Binder服务及源码分析
  • 哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测
  • Neurlps2024论文解读|Credit Attribution and Stable Compression-water-merged
  • Unity3D MMORPG 任务系统的架构与设计详解
  • 中间件-redis-(ubantu)
  • 聚焦 AUTO TECH China 2025,共探汽车内外饰新未来Automotive Interiors
  • 2025年智慧城市解决方案下载:AI-超脑中台,体系架构整体设计
  • 【ubuntu下验证下菜品识别,训练,部署,验证 CNN + TensorFlow / PyTorch】
  • 14.1 Auto-GPT 项目定位与价值解读:揭开自主智能体的神秘面纱
  • 【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS
  • 物联网有哪些就业方向?
  • 问卷数据分析|SPSS实操之独立样本T检验
  • 【大数据安全分析】数据传输方式
  • vue知识点2
  • 前端安全问题及防范
  • 分享一款免费的AI大模型字幕工具,支持语音识别、字幕断句、优化、翻译、视频合成等全流程自动处理(支持抖音、B站、油管等国内外多平台视频下载与处理)
  • 宠物咖啡馆平台
  • CSA发布 | 云计算关键领域安全指南v5
  • pytorch笔记:mm VS bmm
  • npm介绍(Node Package Manager)(JavaScript生态中最流行的包管理工具,主要用于Node.js项目的依赖管理)
  • Python的那些事第十八篇:框架与算法应用研究,人工智能与机器学习
  • Vue3+element-plus表单重置resetFields方法失效问题