Ich habe dies string s1 = "My name is X Y Z"
und ich möchte die Reihenfolge der Wörter so umkehren s1 = "Z Y X is name My"
.
Ich kann es mit einem zusätzlichen Array tun. Ich habe mir überlegt, aber ist es möglich, dies an Ort und Stelle (ohne Verwendung zusätzlicher Datenstrukturen) und mit einer zeitlichen Komplexität von O (n) zu tun?
algorithm
data-structures
string
Arnkrishn
quelle
quelle
string.split(' ').reverse().join(' ')
Antworten:
Kehren Sie die gesamte Zeichenfolge um und kehren Sie dann die Buchstaben jedes einzelnen Wortes um.
Nach dem ersten Durchgang wird die Zeichenfolge sein
und nach dem zweiten Durchgang wird es sein
quelle
Kehren Sie die Zeichenfolge um und kehren Sie dann in einem zweiten Durchgang jedes Wort um ...
in c # vollständig an Ort und Stelle ohne zusätzliche Arrays:
static char[] ReverseAllWords(char[] in_text) { int lindex = 0; int rindex = in_text.Length - 1; if (rindex > 1) { //reverse complete phrase in_text = ReverseString(in_text, 0, rindex); //reverse each word in resultant reversed phrase for (rindex = 0; rindex <= in_text.Length; rindex++) { if (rindex == in_text.Length || in_text[rindex] == ' ') { in_text = ReverseString(in_text, lindex, rindex - 1); lindex = rindex + 1; } } } return in_text; } static char[] ReverseString(char[] intext, int lindex, int rindex) { char tempc; while (lindex < rindex) { tempc = intext[lindex]; intext[lindex++] = intext[rindex]; intext[rindex--] = tempc; } return intext; }
quelle
quelle
In Smalltalk:
Ich weiß, niemand kümmert sich um Smalltalk, aber es ist so schön für mich.
quelle
Sie können die Umkehrung nicht ohne mindestens eine zusätzliche Datenstruktur durchführen. Ich denke, die kleinste Struktur wäre ein einzelnes Zeichen als Puffer, während Sie Buchstaben tauschen. Es kann immer noch als "an Ort und Stelle" betrachtet werden, ist jedoch nicht vollständig "frei von zusätzlichen Datenstrukturen".
Unten finden Sie Code, der implementiert, was Bill the Lizard beschreibt:
quelle
len = strlen(words)
. Die mehrmalige Verwendungstrlen(words)
dauert länger.for(int j = wordstart ; j <= (wordend + wordstart) / 2 ; ++j)
in der letzten for-Schleife statt minus sein?Welche Sprache? Bei PHP können Sie im Weltraum explodieren und das Ergebnis an array_reverse übergeben.
Wenn es nicht PHP ist, müssen Sie etwas etwas komplexeres tun wie:
quelle
Dies ist C # -Code.
quelle
Wie auch immer, Cookamunga lieferte eine gute Inline-Lösung mit Python!
quelle
Dies setzt voraus, dass alle Wörter durch Leerzeichen getrennt sind:
quelle
quelle
Das ist nicht perfekt, aber es funktioniert gerade für mich. Ich weiß nicht, ob es übrigens O (n) Laufzeit hat (studiert es noch ^^), aber es verwendet ein zusätzliches Array, um die Aufgabe zu erfüllen.
Es ist wahrscheinlich nicht die beste Antwort auf Ihr Problem, da ich eine Zielzeichenfolge verwende, um die umgekehrte Version zu speichern, anstatt jedes Wort in der Quellzeichenfolge zu ersetzen. Das Problem ist, dass ich eine lokale Stapelvariable namens buf verwende, um alle Wörter zu kopieren, und ich kann nicht kopieren, sondern in die Quellzeichenfolge, da dies zu einem Absturz führen würde, wenn die Quellzeichenfolge vom Typ const char * ist.
Aber es war mein erster Versuch, s.th. so :) Ok genug blablub. Hier ist Code:
quelle
Wir können die Zeichenfolge in einen Stapel einfügen, und wenn wir die Wörter extrahieren, werden sie in umgekehrter Reihenfolge angezeigt.
quelle
Dieses schnelle Programm funktioniert. Es werden jedoch keine Eckfälle überprüft.
quelle
Die meisten dieser Antworten berücksichtigen keine führenden und / oder nachfolgenden Leerzeichen in der Eingabezeichenfolge. Betrachten Sie den Fall von
str=" Hello world"
... Das einfache Algo, die gesamte Zeichenfolge umzukehren und einzelne Wörter umzukehren, führt dazu, dass Trennzeichen umgedreht werdenf(str) == "world Hello "
.Das OP sagte "Ich möchte die Reihenfolge der Wörter umkehren" und erwähnte nicht, dass führende und nachfolgende Leerzeichen ebenfalls umgedreht werden sollten! Obwohl es bereits eine Menge Antworten gibt, werde ich in C ++ eine [hoffentlich] korrektere bereitstellen:
quelle
Meine Version der Verwendung von Stack:
quelle
Speichern Sie jedes Wort als Zeichenfolge im Array und drucken Sie es dann von Ende
quelle
Wenn Sie in Python nicht [:: - 1] oder reverse () verwenden können, haben Sie folgende einfache Möglichkeit:
quelle
Drucken von Wörtern in umgekehrter Reihenfolge einer bestimmten Anweisung mit C #:
quelle
Hier ist die Java-Implementierung:
quelle
Eigentlich die erste Antwort:
funktioniert nicht, weil es in der zweiten Hälfte der Schleife die Arbeit in der ersten Hälfte rückgängig macht. Also, i <words.length / 2 würde funktionieren, aber ein klareres Beispiel ist folgendes:
Hinweis: Ich bin mit der PHP-Syntax nicht vertraut und habe die Inkrementierungs- und Dekrementierungssyntax erraten, da sie Perl ähnlich zu sein scheint.
quelle
Wie wäre es mit ...
Ich denke, das stimmt nicht.
quelle
In c können Sie dies so tun, O (N) und nur O (1) -Datenstrukturen (dh ein Zeichen) verwenden.
quelle
Mit sscanf geht es einfacher:
quelle
}}
quelle
In Java mit einem zusätzlichen String (mit StringBuilder):
In Java an Ort und Stelle:
quelle
Hier ist eine C-Implementierung, die das Wort inlace umkehrt und komplex ist
O(n)
.quelle
c # Lösung zum Umkehren von Wörtern in einem Satz
Ausgabe: peaople the of heart the in lies beauty Drücken Sie eine beliebige Taste, um fortzufahren. . .
quelle
Bessere Version
Überprüfen Sie mein Blog http://bamaracoulibaly.blogspot.co.uk/2012/04/19-reverse-order-of-words-in-text.html
quelle
quelle
Ich weiß, dass es mehrere richtige Antworten gibt. Hier ist die in C, die ich mir ausgedacht habe. Dies ist eine Implementierung der ausgenommenen Antwort. Die Zeitkomplexität ist O (n) und es wird keine zusätzliche Zeichenfolge verwendet.
quelle