Umgekehrte Reihenfolge der Wörter im string
Bereite ich für ein entry-level-job interview. Ich bin versucht, die Reihenfolge der Wörter in einem string, aber meine Ausgabe ist ein Haufen Müll, der keinen Sinn macht. Ich denke, das problem kann sein, da bin ich mit "char*" für meine Aufgaben? Anyways, hier ist mein code
#include <iostream>
#include <string>
using namespace std;
char* reverse(char* str, int a, int b);
char* reversewords(char* str);
int main()
{
char str[] = "The interview is";
cout<<"Reverse is: "<<reversewords(str);
cin.ignore();
return 0;
}
char* reverse(char* str, int a, int b)
{
int length = a-b;
for (int i=a; i<b+1; i++)
{
char c =str[length-i-1];
str[length-i-1]=str[i];
str[i] = c;
}
return str;
}
char* reversewords(char* str)
{
int length = strlen(str);
int a=0;
int b=0;
while (b<length)
{
if (str[b]==' ' || b==length-1)
{
b=b-1;
reverse(str, a, b);
a=b+2;
b=a;
}
b++;
}
return str;
}
mögliche Duplikate von Umkehren der Reihenfolge der Worte in einem string
Wie könnte man sich sogar Fragen, diese ohne die Webseite, die Warnung, dass es ist gebeten worden, eine million mal bereits?
Sollte das nicht für loop-Signatur:
Wie könnte man sich sogar Fragen, diese ohne die Webseite, die Warnung, dass es ist gebeten worden, eine million mal bereits?
Sollte das nicht für loop-Signatur:
for (int i = a; i > b+1; i--)
(verwenden Sie >
statt <
- und Dekrement -i
).InformationsquelleAutor user3370198 | 2014-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchte ich bekräftigen, was WeaselFox sagte über nicht das Rad neu erfinden, versuchen zu lernen, die C++ STL, auf lange Sicht, die viel mehr hilfreich.
Gesagt haben, dass lassen Sie mich schlage vor, einen Ansatz gut. Wann immer Sie kommen über Probleme wie die Umkehrung der Reihenfolge der Zeichen in einer Zeichenfolge ODER die Umkehrung der Wörter in einer Zeichenfolge, Interviewer wirklich versuchen, Ihr wissen zu testen von Datenstrukturen, und in diesem Fall speziell die "stack" - Datenstruktur.
Überlegen, was passiert, wenn Sie das analysieren von Wörtern in einer Zeichenfolge, und legen Sie Sie alle in ein array ein zu einer Zeit:
"Ich BIN EIN STRING" --> {"ich", "BIN", "EIN", "STRING"}
Nun tun Sie das gleiche für einen Stapel:
"Ich BIN EIN STRING" --> {"STRING", "EIN", "AM", "I"}
Sehen Sie, warum ein stack wäre sinnvoll ? Es ist besser, wenn Sie Grund, es selbst, als ich source-code, der Grund dafür ist, dass Ihr Ansatz falsch ist, unabhängig davon, ob oder nicht es liefert die richtige Antwort.
Ich hoffe, das hilft!
Ihre Antwort könnte leicht bearbeitet werden, um zu erklären, warum der stack-Ansatz führt zu saubereren code ohne spoonfeeding die Lösung-Implementierung.
Es ist besser, verwenden rekursive Funktion zum umkehren der Zeichenfolge speichern dann den string selbst in einem Stapel.
InformationsquelleAutor shafeen
Wenn Sie wollen ein C-wie-Lösung, können Sie es mit nur Zeiger und eine temp variable vom Typ
char
wenn Sie brauchen, um Ihre eigenen definierenreverse
- Funktion zum umkehren einer Zeichenfolge zwischen zwei Zeiger. Den code unten einfach umkehrt, wird die gesamte Zeichenfolge, die es erhält (es könnte geändert werden, um reverse-nur den string in einen Bereich [iterA, iterB)) und kehrt die Buchstaben in jedem Wort ist, dass string. Zum Beispiel die Umkehrunghello world!
erste Ergebnisse in!dlrow olleh
innenreverse_words
, die korrigiert wird, umworld! hello
.Sie ersetzen könnte
std::reverse
in der Bibliothek für diereverse
Funktion oben definiert. Ich habe eine Umsetzung dennoch. Eine Implementierung vonreverse_words
arbeiten an einer Reihe werden könnte, potentiell nützlicher und sollte nicht schwierig sein zu implementieren, mit dem obigen code. Es bleibt als übung dem Leser.InformationsquelleAutor Chrono Kitsune
lassen Sie mich empfehlen, einen anderen Ansatz. Wenn du mit char-Zeigern:
strtok
in ein array vonchar*
s.Wenn Sie entscheiden, zu verwenden, Zeichenfolgen-und STL-Container finden Sie diese Frage als für die Spaltung des string-Token ist, und wobei Sie schön:
Split einen string in C++?
Es ist immer eine bessere Idee, nicht das Rad neu zu erfinden. Die Verwendung von Bibliotheksfunktionen, nicht zu manipulieren, die chars selbst.
Während der Verwendung von strtok klingt wie eine gute Idee, ich wollte dieses problem zu lösen, im Fall von "Reverse string vertauschen Sie das erste Zeichen mit dem letzten Zeichen, das zweite Zeichen mit den zweiten‐zum‐letzten Zeichen, und so weiter. Dann gehen Sie durch die string-Suche für Räume. Rückseite jedes der Wörter, die Sie stoßen, indem Sie wieder vertauschen Sie das erste Zeichen mit dem letzten Zeichen, das zweite Zeichen mit den zweiten‐zum‐letzten Zeichen, und so weiter"
InformationsquelleAutor WeaselFox
InformationsquelleAutor Ace Mcgillicutty
Ändern
int length = a-b;
zuint length = b-a+1;
imreverse()
.Außerdem müssen Sie eine Schleife bis zur Mitte, sonst wird es Umgekehrt sein zweimal, und geben der ursprünglichen Ausgabe.
InformationsquelleAutor Rikayan Bandyopadhyay
InformationsquelleAutor Shashank
Nur, um Ihnen headsup, wie das umkehren einer Zeichenfolge unter Verwendung der REKURSION, die ich modifiziert Ihren code, wird unten angezeigt. Lernen und spüren Sie die Kraft der Rekursion.
malloc
stattnew
?Verwendet new statt malloc. Geändert in der Antwort, und wo ich ein Speicherleck?
In der main-Funktion. Wenn Sie
new[]
, benötigen Sie ein entsprechendesdelete[]
. Ebenfalls fürmalloc
undfree
.InformationsquelleAutor iankits
hier ist meine version
InformationsquelleAutor user110036