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?Sie könnten es so versuchen. Ich bin mir sicher, dass es noch Spielraum für eine Überarbeitung gibt. Ich kam nicht umhin, die Split-Funktion zu verwenden. Vielleicht kennt jemand eine Möglichkeit, es ohne Split zu machen.
Code zum Einrichten, den Sie in Ihre .js-Bibliothek einfügen können
Code zur Verwendung (hat clientseitigen Code, nur weil er in einem Browser getestet wurde):
var sentence = "My Stack is Overflowing."
document.write(sentence.reverseLetters() + '<br />');
document.write(sentence.reverseWords() + '<br />');
Schnipsel:
String.prototype.aggregate = function(vals, aggregateFunction) {
var temp = '';
for (var i = vals.length - 1; i >= 0; i--) {
temp = aggregateFunction(vals[i], temp);
}
return temp;
}
String.prototype.reverseLetters = function() {
return this.aggregate(this.split(''),
function(current, word) {
return word + current;
})
}
String.prototype.reverseWords = function() {
return this.aggregate(this.split(' '),
function(current, word) {
return word + ' ' + current;
})
}
var sentence = "My Stack is Overflowing."
document.write(sentence.reverseLetters() + '<br />');
document.write(sentence.reverseWords() + '<br />');
Wir können das String-Array von beiden Enden aus iterieren: Start und Ende, und bei jeder Iteration vertauschen.
function reverse(str) {
let strArray = str.split("");
let start = 0;
let end = strArray.length - 1;
while(start <= end) {
let temp = strArray[start];
strArray[start] = strArray[end];
strArray[end] = temp;
start++;
end--;
}
return strArray.join("");
}
Obwohl sich die Anzahl der Operationen verringert hat, ist die Zeitkomplexität immer noch O(n), da die Anzahl der Operationen immer noch linear mit der Größe der Eingabe skaliert.
Ref: AlgoDaily
Eine andere Variante (funktioniert sie auch mit IE?):
String.prototype.reverse = function() {
for (i=1,s=""; i<=this.length; s+=this.substr(-i++,1)) {}
return s;
}
EDITAR:
Dies geschieht ohne die Verwendung von integrierten Funktionen:
String.prototype.reverse = function() {
for (i=this[-1],s=""; i>=0; s+=this[i--]) {}
return s;
}
Hinweis: this[-1] enthält die Länge der Zeichenkette.
Es ist jedoch nicht möglich, die Zeichenkette an Ort und Stelle umzukehren, da die Zuweisung an einzelnen Array-Elementen funktioniert nicht mit String-Objekt (geschützt?). D.h. Sie können Zuweisungen tun, aber die resultierende Zeichenfolge ändert sich nicht.
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