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


    题目部分

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


    第一条评论是 "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代码

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.Scanner;
    4. /**
    5. * 评论转换输出
    6. *
    7. * @since 2023.10.18
    8. * @version 0.1
    9. * @author Frank
    10. *
    11. */
    12. public class CommentsTransfer {
    13. public static void main(String[] args) {
    14. Scanner sc = new Scanner(System.in);
    15. while (sc.hasNext()) {
    16. String input = sc.nextLine();
    17. String[] inputStr = input.split(",");
    18. int count = inputStr.length / 2;
    19. String[] contents = new String[count];
    20. int[] childrenCnt = new int[count];
    21. for (int i = 0; i < count; i++) {
    22. contents[i] = inputStr[2 * i];
    23. childrenCnt[i] = Integer.parseInt(inputStr[2 * i + 1]);
    24. }
    25. processCommentsTransfer(contents, childrenCnt);
    26. }
    27. }
    28. private static void processCommentsTransfer(String[] contents, int[] childrenCnt) {
    29. List> commentsList = new ArrayList>();
    30. int curLevel = 0;
    31. int curIndex = 0;
    32. while (curIndex <= contents.length - 1) {
    33. curIndex = processEachLevel(curIndex, curLevel, commentsList, contents, childrenCnt);
    34. }
    35. System.out.println( commentsList.size() );
    36. for( int i = 0; i < commentsList.size(); i ++ )
    37. {
    38. List comments = commentsList.get( i );
    39. for( int j = 0; j < comments.size(); j ++ )
    40. {
    41. System.out.print( comments.get( j ));
    42. if( j < comments.size() - 1 )
    43. {
    44. System.out.print( "," );
    45. }else
    46. {
    47. System.out.println();
    48. }
    49. }
    50. }
    51. }
    52. private static int processEachLevel(int curIndex, int curLevel, List> commentsList, String[] contents,
    53. int[] childrenValues) {
    54. int index = curIndex;
    55. List comments;
    56. if( curLevel >= commentsList.size() )
    57. {
    58. comments = new ArrayList();
    59. commentsList.add( comments );
    60. }else
    61. {
    62. comments = commentsList.get( curLevel );
    63. }
    64. int curChildrenCnt = childrenValues[ curIndex ];
    65. comments.add( contents[index] );
    66. index ++;
    67. if( curChildrenCnt == 0 )
    68. {
    69. return index;
    70. }
    71. // 有children的情况
    72. for( int i = 0; i < curChildrenCnt; i ++ )
    73. {
    74. index = processEachLevel( index, curLevel + 1, commentsList, contents, childrenValues);
    75. }
    76. return index;
    77. }
    78. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var inputArr = line.split(",");
    7. var count = inputArr.length / 2;
    8. var contents = new Array();
    9. for (var i = 0; i < count; i++) {
    10. var eachContent = new Array();
    11. eachContent[0] = inputArr[2 * i];
    12. eachContent[1] = parseInt(inputArr[2 * i + 1]);
    13. contents[i] = eachContent;
    14. }
    15. processCommentsTransfer(contents);
    16. }
    17. }();
    18. function processCommentsTransfer(contents) {
    19. var commentsList = new Array();
    20. var curLevel = 0;
    21. var curIndex = 0;
    22. while (curIndex <= contents.length - 1) {
    23. curIndex = processEachLevel(curIndex, curLevel, commentsList, contents);
    24. }
    25. console.log(commentsList.length);
    26. for (var i = 0; i < commentsList.length; i++) {
    27. var outputStr = "";
    28. var comments = commentsList[i];
    29. for (var j = 0; j < comments.length; j++) {
    30. outputStr += comments[j];
    31. if (j < comments.length - 1) {
    32. outputStr += ",";
    33. }
    34. }
    35. console.log(outputStr);
    36. }
    37. }
    38. function processEachLevel(curIndex, curLevel, commentsList, contents) {
    39. var index = curIndex;
    40. var comments;
    41. if (curLevel >= commentsList.length) {
    42. comments = new Array();
    43. commentsList.push(comments);
    44. } else {
    45. comments = commentsList[curLevel];
    46. }
    47. var curChildrenCnt = contents[index][1];
    48. comments.push(contents[index][0]);
    49. index++;
    50. if (curChildrenCnt == 0) {
    51. return index;
    52. }
    53. // 有children的情况
    54. for (var i = 0; i < curChildrenCnt; i++) {
    55. index = processEachLevel(index, curLevel + 1, commentsList, contents);
    56. }
    57. return index;
    58. }

    (完)

  • 相关阅读:
    数据库入门知识基本简介
    【项目设计】网络对战五子棋(上)
    windows中MySQL主从配置【第一篇】
    泡泡玛特:一家中国潮玩品牌的出海之旅
    TreeMap和LinkedHashMap
    计算机二级C语言经典资料汇总
    4-硝基苯-Β-D-葡萄糖苷酸,4-nitrophenyl-beta-d-glucuronide, cas:10344-94-2
    阿里巴巴面试题- - -多线程&并发篇(二十三)
    墙面想贴好墙布,这些方法指南一定要看~好佳居窗帘十大品牌
    技术分享 | Jenkins中,如何管理用户及其相对应权限?
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/133787946