Search code examples
javascriptalgorithmcomparison-operators

Comparison operator not working(Java Script)


I am trying to replace all the letters of a string by the next letter in the alphabet.

For example: a --> b or i --> j.

My program is ignoring the if statement that checks a letter against the alphabet array. When I try running the code it replaces all letters by "A", the last element in the alphabet array.

Although inefficent, I cannot find any errors with this algorithm. So why is the program ignoring the if statement?

function LetterChanges(str){ 
var alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","a"];
str = str.toLowerCase();
var ans = str.split("");

for(i = 0; i < ans.length; i ++)//Running through for each letter of the input string
{
    for(a = 0; a < 26; a++)//Checking each letter against the alphabet array
    {
        if(alphabet[a] == ans[i])
        {
          ans[i] = alphabet[a+1];
        }
    }
}
return ans;
}

LetterChanges("Argument goes here");

Solution

  • The reason why it is not working, is because the ans array is modified, whilst you are still checking it.

    In this loop:

    for(a = 0; a < 26; a++)//Checking each letter against the alphabet array
    {
        if(alphabet[a] == ans[i])
        {
          ans[i] = alphabet[a+1];
        }
    }
    

    If the if statement is found to be true, ans[i] will be updated, but then on the next loop of the iteration, it will likely be true again, as you are checking against the updated ans[i] variable.

    As @xianshenglu suggested, you can fix this issue by adding a break to escape from the inner loop once a correct match is found.

    for(a = 0; a < 26; a++) {
      if(alphabet[a] == ans[i]) {
        ans[i] = alphabet[a+1]
        // escape from the inner loop once a match has been found
        break
      }
    }
    

    For an alternative way to do this, you could do the following:

    var result = str.toLowerCase().split('').map(ch => {
      var pos = alphabet.indexOf(ch)
      return pos >= 0 ? alphabet[pos + 1] : ch
    }).join('')
    

    And if you want to get rid of the alphabet array, you can use char codes. For example:

    var result = str.toLowerCase().split('').map(ch => {
      var code = ch.charCodeAt(0)
      if(code < 96 || code > 122){ return ch }
      return String.fromCharCode((code - 96) % 26 + 97)
    }).join('')