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/

2voto

nonopolarity Punkte 138211

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

2voto

jingyinggong Punkte 636

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";

1voto

AntonB Punkte 2505

Mein eigener ursprünglicher Versuch...

var str = "The Car";

function reverseStr(str) {
  var reversed = "";
  var len = str.length;
  for (var i = 1; i < (len + 1); i++) {  
    reversed += str[len - i];      
  }

  return reversed;
}

var strReverse = reverseStr(str);    
console.log(strReverse);
// "raC ehT"

http://jsbin.com/bujiwo/19/edit?js,console,output

1voto

manan5439 Punkte 858

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.

1voto

Amr Ali Punkte 73

ES6

 function reverseString(str) {
     return [...str].reverse().join("");
 }

 console.log(reverseString("Hello")); // olleH

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