【华为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 <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Node {
char *str;
int n;
struct Node *children;
};
int depth = 0;
char str[10240] = { 0 };
char buffer[1024 * 1024] = { 0 };
char *ptr = NULL;
int getitem(char *str, int *n) {
if (!ptr) {
return 0;
}
strcpy(str, ptr);
ptr = strtok(NULL, ",");
if (!ptr) {
return 0;
}
*n = atoi(ptr);
ptr = strtok(NULL, ",");
return 1;
}
void read(struct Node *root, int idx, int level)
{
int n;
int cnt = 0;
int len = 0;
struct Node *current;
if (level > depth) {
depth = level;
}
for (int i = 0; i < root->n; ++i) {
if (!getitem(str, &n)) {
break;
}
current = &root->children[i];
current->n = n;
len = strlen(str) + 4;
current->str = (char*)malloc(len);
memset(current->str, 0, len);
strcpy(current->str, str);
if (n > 0) {
current->children = (struct Node*)malloc(sizeof(struct Node) * n);
memset(current->children, 0, sizeof(struct Node) * n);
read(current, 0, level + 1);
}
else {
current->children = NULL;
}
++cnt;
}
root->n = cnt;
}
void output(struct Node *root, int idx, int level) {
if (level > idx) return;
for (int i = 0; i < root->n; ++i) {
if (level == idx) {
printf("%s ", root->children[i].str);
}
else if (level < idx) {
output(&root->children[i], idx, level + 1);
}
}
}
int main() {
struct Node *root = (struct Node*)malloc(sizeof(struct Node));
root->n = 1024;
root->children = (struct Node*)malloc(sizeof(struct Node) * root->n);
depth = 0;
fgets(buffer, sizeof(buffer), stdin);
ptr = strtok(buffer, ",");
read(root, 0, 1);
printf("%d\n", depth);
for (int i = 1; i <= depth; ++i) {
output(root, i, 1);
printf("\n");
}
free(root);
return 0;
}