Frageteil
Thema | Ausgabe der Kommentarkonvertierung |
Schwierigkeit | Katastrophe |
Beschreibung der Frage | Auf einer Blog-Site hat jeder Blog-Beitrag Kommentare. Jeder Kommentar ist eine nicht leere englische alphabetische Zeichenfolge. Kommentare haben eine Baumstruktur, wobei jeder Kommentar außer dem Stammkommentar einen übergeordneten Kommentar hat. Wenn ein Kommentar gespeichert wird, verwenden Sie das folgende Format: Zuerst der Inhalt des Kommentars; Dann die Anzahl der Antworten auf den aktuellen Kommentar; Schließlich gibt es alle Unterkommentare des aktuellen Kommentars. (Untergeordnete Kommentare werden im gleichen Format verschachtelt gespeichert.) Alle Elemente werden durch ein einzelnes Komma getrennt. Wenn die Kommentare beispielsweise wie folgt lauten: ![]() Der erste Kommentar ist „hello,2,ok,0,bye,0“ und der zweite Kommentar ist „ „test,0“, der dritte Kommentar ist „one,1,two,1,a,0“. Alle Kommentare werden als „hello,2,ok,0,bye,0,test,0,one,1,two,1,a,0“ gespeichert. Für Kommentare im oben genannten Format drucken Sie diese bitte in einem anderen Format aus: Drucken Sie zunächst die maximale Tiefe der Kommentarverschachtelung aus. Dann werden n Zeilen gedruckt, und die i-te (1 ≤ i ≤ n) Zeile entspricht dem Kommentar mit der Verschachtelungsebene i (die Verschachtelungsebene des Stammkommentars ist 1). Für Zeile i werden Kommentare auf Verschachtelungsebene in der Reihenfolge gedruckt, in der sie erscheinen, getrennt durch Leerzeichen. |
Beschreibung eingeben | Einzeiliger Kommentar. Es besteht aus englischen Buchstaben, Zahlen und englischen Kommas. Stellen Sie sicher, dass jeder Kommentar eine nicht leere Zeichenfolge aus englischen Zeichen ist. Die Nummer jedes Kommentars ist eine Ganzzahl (bestehend aus mindestens einer Zahl). Die Länge der gesamten Zeichenfolge überschreitet nicht Die angegebene Kommentarstruktur ist garantiert legal. |
Ausgabebeschreibung | Druckt Kommentare im angegebenen Format. Für jede Verschachtelungsebene sollten Kommentare in der Reihenfolge gedruckt werden, in der sie in der Eingabe vorliegen. |
Weitere Informationen | keiner |
-------------------------------------------------- ---- | |
Beispiel | |
Beispiel 1 | |
eingeben | hallo,2,ok,0,bye,0,test,0,one,1,two,1,a,0 |
Ausgabe | 3 Hallo Test eins ok, tschüss zwei a |
veranschaulichen | Wie in der Abbildung in der Problembeschreibung dargestellt, beträgt die maximale Verschachtelungsebene 3. Ein Kommentar auf Verschachtelungsebene 1 ist „Hallo Test eins“, ein Kommentar auf Verschachtelungsebene 2 ist „ok, tschüss zwei“ und ein Kommentar auf Verschachtelungsebene 3 ist „a“. |
Beispiel 2 | |
eingeben | A,5,A,0,a,0,A,0,a,0,A,0 |
Ausgabe | 2 A A a A a A |
veranschaulichen | Wie in der folgenden Abbildung dargestellt, beträgt die maximale Verschachtelungsebene 2, ein Kommentar mit der Verschachtelungsebene 1 ist „A“ und ein Kommentar mit der Verschachtelungsebene 2 ist „A a A a A“.![]() |
Beispiel 3 | |
eingeben | 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 |
Ausgabe | 4 A K M B F H L N O C D G I P E J |
veranschaulichen | Wie nachfolgend dargestellt.![]() |
Interpretation und Analyse
Artikelerklärung:
Geben Sie eine Zeichenfolge ein und konvertieren Sie sie gemäß den angegebenen Regeln in ein anderes Ausgabeformat.
Analyse Yoshiro:
Dieses Problem kann durch Rekursion gelöst werden. Die Zeitkomplexität und die Raumkomplexität sind beide O(n).
Code
Java-Code
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-Code
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;
}
(über)