498 votes

Comment inverser une chaîne de caractères en place en JavaScript ?

Comment inverser une chaîne en place (ou in-place) en JavaScript lorsqu'elle est passée à une fonction avec une instruction de retour ? Tout cela sans utiliser les fonctions intégrées ? .reverse(), .charAt(), etc.

Merci !

6voto

Fatih Points 8709

C'est le moyen le plus facile je pense

var reverse = function(str) {
    var arr = \[\];

    for (var i = 0, len = str.length; i <= len; i++) {
        arr.push(str.charAt(len - i))
    }

    return arr.join('');
}

reverse('lorem ipsum dolor');

5voto

Scott Gartner Points 169

Je sais que c'est une vieille question à laquelle on a déjà répondu, mais pour mon propre plaisir, j'ai écrit la fonction inverse suivante et j'ai pensé la partager au cas où elle serait utile à quelqu'un d'autre. Elle gère à la fois les paires de substituts et les marques de combinaison :

function StringReverse (str)
{
  var charArray = [];
  for (var i = 0; i < str.length; i++)
    {
      if (i+1 < str.length)
        {
          var value = str.charCodeAt(i);
          var nextValue = str.charCodeAt(i+1);
          if (   (   value >= 0xD800 && value <= 0xDBFF
                  && (nextValue & 0xFC00) == 0xDC00) // Surrogate pair)
              || (nextValue >= 0x0300 && nextValue <= 0x036F)) // Combining marks
            {
              charArray.unshift(str.substring(i, i+2));
              i++; // Skip the other half
              continue;
            }
        }

      // Otherwise we just have a rogue surrogate marker or a plain old character.
      charArray.unshift(str[i]);
    }

  return charArray.join('');
}

Toutes les félicitations à Mathias, Punycode, et diverses autres références pour m'avoir enseigné les complexités du codage des caractères en JavaScript.

4voto

Bjorn Tipling Points 16243

Quelque chose comme (n'a pas été testé) :

var str = reverseStr( "the cow jumped over the moon" );

function reverseStr ( str ) {
  var tR = [ ];
  str = str.split("");
  for ( var i = str.length - 1; i >= 0; i-- ) {
   tR.push( str[ i ] );
  }
  return tR.join( "" ); //noom eht revo depmuj woc eht
}

3voto

Tara Stein Points 31

Consultez ce cours sur CodeCademy : JavaScript intermédiaire . Je suis en train de le tester, mais il semble qu'il vous guide (à un rythme plus rapide) dans la définition des fonctions du Prototype, comme la définition d'un bon reverse() fonction.

2voto

動靜能量 Points 33008

Juste à titre d'exercice : parfois, lorsque vous passez un entretien, l'intervieweur peut vous demander comment faire ceci en utilisant la récursion, et je pense que la "réponse préférée" pourrait être "Je préférerais ne pas faire ceci en récursion car cela peut facilement provoquer un débordement de pile" (parce qu'il est O(n) plutôt que O(log n) Je pense O(log n) Il est beaucoup plus difficile d'obtenir un dépassement de pile -- 4 milliards d'éléments pourraient être gérés par un niveau de pile de 32, car 2 ** 32 est 4294967296.

Mais parfois, l'interviewer vous demandera quand même "juste à titre d'exercice, pourquoi ne pas l'écrire en utilisant la récursion ?". Et voilà :

String.prototype.reverse = function() {
    if (this.length <= 1) return this;
    else return this.slice(1).reverse() + this.slice(0,1);
}

Test de fonctionnement :

var s = "";
for(var i = 0; i < 1000; i++) {
    s += ("apple" + i);
}
console.log(s.reverse());

sortie :

999elppa899elppa...2elppa1elppa0elppa

Pour essayer un débordement de pile, j'ai changé 1000 à 10000 et sur Google Chrome, ça dit :

RangeError: Maximum call stack size exceeded

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X