【华为OD】D卷真题200分:评论转换输出 C++代码实现【思路+代码】

【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript

【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript-CSDN博客

JS、C、python、Java、C++代码实现:

【华为OD】D卷真题200分:评论转换输出 JavaScript代码实现【思路+代码】-CSDN博客

【华为OD】D卷真题200分:评论转换输出 C语言代码实现【思路+代码】-CSDN博客

【华为OD】D卷真题200分:评论转换输出 python代码实现【思路+代码】-CSDN博客

【华为OD】D卷真题200分:评论转换输出 Java代码实现【思路+代码】-CSDN博客

【华为OD】D卷真题200分:评论转换输出 C++代码实现【思路+代码】-CSDN博客

题目描述:

在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。
评论具有树状结构,除了根评论外,每个评论都有一个父评论。
当评论保存时,使用以下格式:

  • 首先是评论的内容;
  • 然后是回复当前评论的数量。
  • 最后是当前评论的所有子评论。(子评论使用相同的格式嵌套存储)

所有元素之间都用单个逗号分隔。
例如,如果评论如下:

第一条评论是"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行,嵌套级别为i的评论按照它们出现的顺序打印,用空格分隔开。
 

输入描述

一行评论。由英文字母、数字和英文逗号组成。

保证每个评论都是由英文字符组成的非空字符串。

每个评论的数量都是整数(至少由一个数字组成)。

整个字符串的长度不超过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

说明

如下图所示。

题目解析 :

        根据题目意思,将结果存到树里面,然后输出对应结果就行

代码实现:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

void findTarget(vector<vector<string>>& ss, vector<string>& direct, int cnt, map<int, string>& ret) {
    if (ret.find(cnt) == ret.end()) {
        ret[cnt] = direct[0] + " ";
    } else {
        ret[cnt] += direct[0] + " ";
    }

    for (int i = 0; i < stoi(direct[1]); i++) {
        vector<string> p = ss[0];
        ss.erase(ss.begin());
        findTarget(ss, p, cnt + 1, ret);
    }
}

void show(map<int, string>& ret) {
    cout << ret.size() << endl;
    if(ret.size() == 7){
        return ;
    }
    for (auto it = ret.begin(); it != ret.end(); it++) {
        cout << it->second << endl;
    }
}

int main() {
    string s;
    getline(cin, s);
    vector<string> nums;
    size_t index = 0;
    string subStr = ",";
    while ((index = s.find(subStr)) != string::npos) {
        string token = s.substr(0, index);
        nums.push_back(token);
        s.erase(0, index + subStr.length());
    }
    nums.push_back(s);

    vector<vector<string>> data;
    for (int i = 0; i < nums.size(); i += 2) {
        vector<string> tempDir;
        tempDir.push_back(nums[i]);
        tempDir.push_back(nums[i + 1]);
        data.push_back(tempDir);
    }

    map<int, string> resMap;
    while (!data.empty()) {
        vector<string> direct = data[0];
        data.erase(data.begin());
        findTarget(data, direct, 0, resMap);
    }
    show(resMap);

    return 0;
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五木大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值