Wie kehrt man eine Zeichenkette in JavaScript an Ort und Stelle um, wenn sie an eine Funktion mit einer Rückgabeanweisung übergeben wird, ohne integrierte Funktionen zu verwenden ( .reverse()
, .charAt()
usw.)?
Antworten
Zu viele Anzeigen?Die richtige Antwort lautet: Sie können sie nicht an Ort und Stelle umkehren, aber Sie können eine neue Zeichenfolge erstellen, die das Gegenteil ist.
Nur als Übung, um mit der Rekursion zu spielen: Manchmal, wenn Sie zu einem Vorstellungsgespräch gehen, kann der Gesprächspartner Sie fragen, wie Sie dies mit Hilfe der Rekursion tun können, und ich denke, die "bevorzugte Antwort" könnte lauten: "Ich würde dies lieber nicht in Rekursion tun, da es leicht zu einem Stapelüberlauf führen kann" (denn es ist O(n)
statt O(log n)
. Wenn es O(log n)
ist es ziemlich schwierig, einen Stapelüberlauf zu verursachen - 4 Milliarden Elemente könnten mit einem Stacklevel von 32 verarbeitet werden, da 2 ** 32 4294967296 ist. Aber wenn es O(n)
dann kann es leicht zu einem Stapelüberlauf kommen.
Manchmal wird der Interviewer Sie trotzdem fragen: "Nur als Übung, warum schreiben Sie es nicht noch mit Rekursion?" Und hier ist sie:
String.prototype.reverse = function() {
if (this.length <= 1) return this;
else return this.slice(1).reverse() + this.slice(0,1);
}
Testlauf:
var s = "";
for(var i = 0; i < 1000; i++) {
s += ("apple" + i);
}
console.log(s.reverse());
Ausgabe:
999elppa899elppa...2elppa1elppa0elppa
Um zu versuchen, einen Stapelüberlauf zu erhalten, änderte ich 1000
à 10000
in Google Chrome und meldete es:
RangeError: Maximum call stack size exceeded
Ich denke, String.prototype.reverse ist ein guter Weg, um dieses Problem zu lösen; der Code wie unten;
String.prototype.reverse = function() {
return this.split('').reverse().join('');
}
var str = 'this is a good example for string reverse';
str.reverse();
-> "esrever gnirts rof elpmaxe doog a si siht";
Verwenden Sie diese Methode, wenn Sie mehr neugierig auf Leistung und Zeitkomplexität sind. in dieser Methode habe ich String in zwei Teil geteilt und sortieren Sie es in Länge/2 mal Schleife Iteration.
let str = "abcdefghijklmnopqrstuvwxyz"
function reverse(str){
let store = ""
let store2 = ""
for(let i=str.length/2;i>=0;i--){
if(str.length%2!==0){
store += str.charAt(i)
store2 += str.slice((str.length/2)+1, str.length).charAt(i)
}else{
store += str.charAt(i-1)
store2 += str.slice((str.length/2), str.length).charAt(i)
}
}
return store2+store
}
console.log(reverse(str))
Es ist nicht optimal, aber wir können so denken.
0 Stimmen
Sie dürfen also nicht .charAt() verwenden, um die Zeichen der Zeichenkette zu erhalten?
192 Stimmen
Das können Sie nicht. JavaScript-Zeichenfolgen sind unveränderlich, was bedeutet, dass der Speicher, der ihnen zugewiesen ist, nicht beschrieben werden kann, was echte "In-Place"-Umkehrungen unmöglich macht.
3 Stimmen
Re: crescentfresh's Kommentar siehe stackoverflow.com/questions/51185/
3 Stimmen
@crescentfresh Sie sollten das als neue Antwort posten.
0 Stimmen
@Irwin, es ist 2015 und charAt() wird immer noch nicht vollständig unterstützt. Wo es unterstützt wird, ist es langsam.
2 Stimmen
Umkehrung einer Zeichenkette auf 3 Arten in Javascript
0 Stimmen
var reverse = (str, rev = '') => str.length == 0 ? console.log(rev) : reverse((str.substr(0,str.length -1)), (rev + str.substr(str.length -1 , 1)));
0 Stimmen
string umkehren in js