599 Stimmen

Wie kehrt man in JavaScript eine Zeichenkette an Ort und Stelle um?

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.)?

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/

997voto

belacqua Punkte 9151

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("");
}

438voto

Mathias Bynens Punkte 136619

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.

104voto

Bob Punkte 1333
String.prototype.reverse_string=function() {return this.split("").reverse().join("");}

ou

String.prototype.reverse_string = function() {
    var s = "";
    var i = this.length;
    while (i>0) {
        s += this.substring(i-1,i);
        i--;
    }
    return s;
}

103voto

Anil Arrabole Punkte 3838

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')

67voto

Mozleron Punkte 629

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X