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 !
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 !
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.
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.
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 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.