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?Solange es sich um einfache ASCII-Zeichen handelt und Sie die eingebauten Funktionen verwenden können, wird dies funktionieren:
function reverse(s){
return s.split("").reverse().join("");
}
Wenn Sie eine Lösung benötigen, die UTF-16 oder andere Multi-Byte-Zeichen unterstützt, sollten Sie sich bewusst sein, dass diese Funktion ungültige Unicode-Zeichenfolgen oder gültige Zeichenfolgen, die komisch aussehen, liefert. Sie sollten Folgendes in Betracht ziehen stattdessen diese Antwort .
[...s] ist Unicode-fähig, ein kleiner Schnitt ergibt:-
function reverse(s){
return [...s].reverse().join("");
}
Die folgende (oder eine ähnliche) Technik wird häufig verwendet, um eine Zeichenfolge in JavaScript umzukehren:
// Don’t use this!
var naiveReverse = function(string) {
return string.split('').reverse().join('');
}
In der Tat sind alle Antworten, die bisher gepostet wurden, eine Variation dieses Musters. Allerdings gibt es einige Probleme mit dieser Lösung. Zum Beispiel:
naiveReverse('foo bar');
// 'rab oof'
// Where did the `` symbol go? Whoops!
Falls Sie sich fragen, warum das so ist, sich über die interne Zeichenkodierung von JavaScript zu informieren . (TL;DR: ist ein Astralsymbol und wird in JavaScript als zwei separate Codeeinheiten dargestellt).
Aber das ist noch nicht alles:
// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana manana');
// 'ananam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.
Ein guter String zum Testen von String-Reverse-Implementierungen ist die folgenden :
'foo bar mañana manana'
Warum? Weil sie ein astrales Symbol enthält ( ) (diese sind dargestellt durch Surrogatpaare in JavaScript ) und eine Kombinationsmarke (das n
im letzten manana
besteht eigentlich aus zwei Symbolen: U+006E LATIN SMALL LETTER N und U+0303 COMBINING TILDE).
Die Reihenfolge, in der die Surrogatpaare erscheinen, kann nicht umgekehrt werden, da sonst das Astralsymbol in der "umgekehrten" Zeichenfolge nicht mehr auftaucht. Deshalb sahen Sie diese Markierungen in der Ausgabe des vorherigen Beispiels.
Kombinationszeichen werden immer auf das vorhergehende Symbol angewandt, daher müssen Sie sowohl das Hauptsymbol (U+006E LATIN SMALL LETTER N) als auch das Kombinationszeichen (U+0303 COMBINING TILDE) als Ganzes behandeln. Eine Umkehrung der Reihenfolge führt dazu, dass das Kombinationszeichen mit einem anderen Symbol in der Zeichenkette gepaart wird. Aus diesem Grund hatte die Beispielausgabe a
anstelle von ñ
.
Das erklärt hoffentlich, warum alle Antworten, die bisher gepostet wurden, falsch .
Um Ihre ursprüngliche Frage zu beantworten - wie man eine Zeichenkette in JavaScript [richtig] umkehrt -, habe ich eine kleine JavaScript-Bibliothek geschrieben, die in der Lage ist, Unicode-fähige String-Umkehrung. Es hat keine der Probleme, die ich gerade erwähnt habe. Die Bibliothek heißt Esrever Der Code befindet sich auf GitHub, und es funktioniert in so ziemlich jeder JavaScript-Umgebung. Es kommt mit einer Shell-Dienstprogramm / binär, so dass Sie leicht umgekehrt Zeichenfolgen von Ihrem Terminal, wenn Sie wollen.
var input = 'foo bar mañana manana';
esrever.reverse(input);
// 'ananam anañam rab oof'
Was den Teil "an Ort und Stelle" betrifft, siehe die anderen Antworten.
Detaillierte Analyse und zehn verschiedene Möglichkeiten, eine Zeichenkette umzukehren, sowie Angaben zu deren Leistung.
http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/
Leistung dieser Implementierungen:
Leistungsstärkste Implementierung(en) pro Browser
- Chrom 15 - Aufdrucke 1 und 6
- Firefox 7 - Implementierung 6
- IE 9 - Umsetzung 4
- Oper 12 - Umsetzung 9
Hier sind diese Umsetzungen:
Umsetzung 1:
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
Durchführung 2:
function reverse(s) {
var o = [];
for (var i = s.length - 1, j = 0; i >= 0; i--, j++)
o[j] = s[i];
return o.join('');
}
Durchführung 3:
function reverse(s) {
var o = [];
for (var i = 0, len = s.length; i <= len; i++)
o.push(s.charAt(len - i));
return o.join('');
}
Umsetzung 4:
function reverse(s) {
return s.split('').reverse().join('');
}
Umsetzung 5:
function reverse(s) {
var i = s.length,
o = '';
while (i > 0) {
o += s.substring(i - 1, i);
i--;
}
return o;
}
Durchführung 6:
function reverse(s) {
for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
return o;
}
Umsetzung 7:
function reverse(s) {
return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}
Umsetzung 8:
function reverse(s) {
function rev(s, len, o) {
return (len === 0) ? o : rev(s, --len, (o += s[len]));
};
return rev(s, s.length, '');
}
Umsetzung 9:
function reverse(s) {
s = s.split('');
var len = s.length,
halfIndex = Math.floor(len / 2) - 1,
tmp;
for (var i = 0; i <= halfIndex; i++) {
tmp = s[len - i - 1];
s[len - i - 1] = s[i];
s[i] = tmp;
}
return s.join('');
}
Umsetzung 10
function reverse(s) {
if (s.length < 2)
return s;
var halfIndex = Math.ceil(s.length / 2);
return reverse(s.substr(halfIndex)) +
reverse(s.substr(0, halfIndex));
}
Umsetzung 11
var reverser = function(str){
let string = str.split('');
for(i=0;i<string.length;i++){
debugger;
string.splice(i,0,string.pop());
}
console.log(string.join())
}
reverser('abcdef')
Die ganze "Umkehrung einer Zeichenkette an Ort und Stelle" ist eine antiquierte Interviewfrage, die C-Programmierer und Leute, die von ihnen interviewt wurden (vielleicht aus Rache?), stellen werden. Leider ist es die "In Place" Teil, der nicht mehr funktioniert, weil Strings in so ziemlich jeder verwalteten Sprache (JS, C #, etc.) verwendet unveränderliche Strings, so dass die ganze Idee der Verschiebung einer Zeichenfolge ohne Zuweisung von neuem Speicher zu besiegen.
Die obigen Lösungen kehren zwar tatsächlich eine Zeichenkette um, aber sie tun dies nicht, ohne mehr Speicher zuzuweisen, und erfüllen daher nicht die Bedingungen. Sie müssen direkten Zugriff auf die zugewiesene Zeichenkette haben und in der Lage sein, den ursprünglichen Speicherplatz zu manipulieren, um sie an Ort und Stelle umkehren zu können.
Ich persönlich hasse diese Art von Vorstellungsgesprächen, aber ich bin mir sicher, dass wir sie in den nächsten Jahren noch öfter sehen werden.
- See previous answers
- Weitere Antworten anzeigen
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