2017-10-08 7 views
0

J'ai écrit une fonction appelée reverseStr qui accepte une chaîne comme paramètre et renvoie la chaîne mais avec les caractères inverses.JS: Inverser une chaîne à l'aide d'une boucle imbriquée ne fonctionne pas

Par exemple: reverseStr('bootcamp'); =>'pmactoob'

Ce qui suit est mon programme:

function reverseStr(str) 
 
{ 
 
\t var splitStr = str.split(""); 
 
\t console.log(splitStr); 
 
\t var reverseString = []; 
 
\t for(var i = 0; i <= splitStr.length -1 ; i++) 
 
\t { 
 
\t \t for(var j = splitStr.length - 1; j >= 0; j--) 
 
\t \t { 
 
\t \t \t reverseString[i] = splitStr[j] 
 
\t \t } 
 
\t } 
 

 
\t return reverseString.toString().replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 
 
}

Si je lance la fonction reverseStr("bootcamp") retourne bbbbbbbb. Est-ce que quelqu'un voit un problème avec le code?

Note: Je DONOT VOULEZ UTILISER REVERSE() INTÉGRÉE FONCTION

Cependant, j'ai trouvé le succès avec le code suivant mais encore besoin d'une réponse à ma question initiale

function reverseStr(str) 
 
{ 
 
\t var splitStr = str.split(""); 
 
\t reverseStr = ""; 
 
\t for(var i = splitStr.length - 1; i >= 0 ; i = i - 1) 
 
\t { 
 
\t \t reverseStr += splitStr[i]; 
 
\t } 
 

 
\t return reverseStr; 
 
}

+0

Avez-vous encore besoin d'une réponse à votre question initiale? – Aydin4ik

+0

oui s'il vous plaît @Aydin – socrates

Répondre

1

Vous n'avez pas besoin de dupliquer deux fois les caractères, c'est-à-dire, vous n'avez pas besoin d'imbriquer les boucles for. Itérer une fois et de saisir les caractères dans l'ordre inverse, comme ceci:

function reverseStr(str) 
{ 
    var splitStr = str.split(""); 
    console.log(splitStr); 
    var reverseString = []; 
    for(var i = 0, j=splitStr.length-1; i <= splitStr.length -1 ; i++, j--) 
    { 
      reverseString[i] = splitStr[j] 
    } 

    return reverseString.toString().replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 
} 

Vous pouvez voir ici que la boucle se poursuit aussi longtemps que i <= splitStr.length -1, à savoir, la longueur de la chaîne. Cela est suffisant pour obtenir le caractère de mise en miroir (i par rapport à Array.length-i).

Voici un extrait de travail à la démo:

var reverseStr = function(str) { 
 
    let result = String(); 
 
    for(let i = str.length-1; i >= 0; i--) { 
 
    result += str.charAt(i); 
 
    } 
 
    return result.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 
 
} 
 
$('button').click(function() { 
 
    $('.result').text(reverseStr($('#str').val())); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <input type="text" id="str"> 
 
    <button>Reverse it</button> 
 
    <div class="result"></div>

Peut-être une façon plus élégante pour obtenir le même (en dehors de Array.prototype.reverse()) serait utilisez String.prototype.chatAt(). Cela évite deux conversions vers et depuis un tableau, et vous permet également d'économiser une variable. Certes, le code est beaucoup plus court et plus évident dans ce qu'il fait.

var reverseStr = function(str) { 
 
    let result = String(); // An empty string to store the result 
 
    for(let i = str.length-1; i >= 0; i--) { // Iterate backwards thru the chars and add to the result string 
 
    result += str.charAt(i); 
 
    } 
 
    return result.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); // Original return method of the author 
 
} 
 
$('button').click(function() { 
 
    $('.result').text(reverseStr($('#str').val())); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <input type="text" id="str"> 
 
    <button>Reverse it</button> 
 
    <div class="result"></div>

+0

Je reçois une erreur après 'i <= splitStr.length -1;' – socrates

+0

J'ai ajouté une autre façon de faire ce que votre code était censé faire - il pourrait être un moyen plus propre d'accomplir la tâche. Ce n'est pas une réponse directe à votre question - juste en faisant remarquer que quelqu'un peut trouver cela utile. – Aydin4ik

0

Le problème est que votre boucle for imbriquée exécute tout son parcours avant de retourner à l'extérieur for boucle. Ainsi, il répète juste un caractère le nombre de fois égal à la longueur. Au lieu d'avoir une autre boucle for, ajoutez simplement un simple compteur pour j comme j++ dans votre boucle externe for et utilisez cette valeur avec la valeur i.

0

Pour l'affiche originale, considérez ceci:

Si vous connaissez la longueur de la chaîne d'origine, vous savez donc le décalage de cette dernière position dans la chaîne d'origine.

Effectue une itération sur la chaîne d'origine dans l'ordre inverse, en ajoutant la valeur de la position actuelle à une nouvelle chaîne. La nouvelle chaîne serait l'inverse de l'original.

0

L'exemple d'Aydin est essentiellement correct. Voici ma version très similaire, avec des commentaires:

function reverseString(inputString) { 
    // create a new empty string 
    var newString = ""; 

    // iterate through the characters of the string in reverse order, 
    // appending to the new string 
    for (var i = inputString.length - 1; i >= 0; i--) { 
     newString += inputString[i]; 
    } 

    return newString; 
} 

console.log(reverseString('bootcamp'));