2016-08-15 3 views
0

Frage: Schreiben Sie eine Funktion, die eine Zeichenfolge als Eingabe verwendet und die Zeichenfolge zurückgegeben wird umgekehrt.Reverse String (Leetcode) Verwendung von C++, Warum kann ich die neue Zeichenfolge als Methode nicht zurückgeben

Beispiel: Gegeben s = "Hallo", zurück "olleh".

Was ist falsch an diesem Code?

class Solution { 
public: 
    string reverseString(string s) { 

     string s2; 

     for(int i=0; i<s.length(); i++) 
      s2[i] = s[s.length()-1-i]; 

     return s2; 
    } 
}; 
+1

Verwendung reverse_copy? – YOU

+0

Was meinst du mit "Ich kann das nicht machen"? Welche Indikation (en) haben Sie, dass dies falsch ist? –

+0

ja, das ist umgekehrte Kopie, was ist falsch in diesem Code? – User6715985

Antwort

2

Sie haben den gebundenen Zugriff verlassen, Sie müssen die Ergebniszeichenfolge ändern, bevor Sie sie zuweisen.

std::string reverseString(const std::string& s) { 
    std::string s2(s.size(), '\0'); 

    for(int i=0; i<s.length(); i++) 
     s2[i] = s[s.length()-1-i]; 

    return s2; 
} 

Oder verwenden Sie einfach richtig Konstruktor:

std::string reverseString(const std::string& s) { 
    return {s.rbegin(), s.rend()}; 
} 
+0

Das sollte sein '(s.Size(), '\ 0') '(oder ein anderes Zeichen oder ein Aufruf von' resize'). 'std :: string' entschied sich für keinen Konstruktor, der nur eine Größe annimmt, weil' std :: string s = 'a'; 'nicht auf 1 Zeichen (a) initialisiert würde. – chris

+0

@chris: behoben, danke. – Jarod42

+0

Vielen Dank @chris – User6715985

2

Da die erste Iteration der Schleife versucht s2[0] bis zum letzten Zeichen des ursprünglichen Zeichenfolge einzustellen.

Das Problem ist, dass es keine s2[0] gibt. Der String s2 ist vollständig leer. Die Zeichenfolge s2 ist im Wesentlichen ein leeres Array.

Der Versuch, den Inhalt der Zeichenfolge, die den [] Operator den Zugriff greift auf die bestehenden Charakter dieser Zeichenfolge. Es wird keins erstellt, wenn es nicht existiert.

Auch wenn die Codeausführung dieses undefinierte Verhalten übersteht, wird bei der nächsten Iteration der Schleife versucht, s2[1] auf ein Zeichen zu setzen. s2[1] existiert nicht, mehr als s2[0] tat. Und so weiter. Undefiniertes Verhalten Absturz.

Anstatt nicht vorhandene Werte einer leeren Zeichenfolge zu setzen, verwenden Sie einfach push_back(), um jedes Zeichen zu s2 hinzuzufügen.

Dies ist natürlich kein besonders effizienter Ansatz, um den Inhalt der Saite umzukehren. Aber es ist ein guter erster Versuch, diese einleitende Aufgabe zu bewältigen.

+0

Sam, vielen Dank für meine begrenzte Erfahrung mit String & Array-Konzept ...... Ich habe es – User6715985

+0

Vielen Dank ... @Sam Varshavchik – User6715985

Verwandte Themen