skip to Main Content
  • Input: aHtuE
  • Expected Output: A-Hh-Ttt-Uuuu-Eeeee
  • Actual Output: A-HH-Ttt-Uuuu-Eeeee

The function takes a string (in this example "aHtuE") and the output should be "A-Hh-Ttt-Uuuu-Eeeee". However the second "h" in this example appears in upper case instead of lower case. I guess it’s a counting problem or so, but whatever I try, I don’t get it.

function accum(s) {
  // Fill char with first character in upper case
  let char = (s.substring(0, 1)).toUpperCase();
  let result = "";

  for (i = 1; i <= s.length; i++) {
    // Add '-' 
    result += char + "-";
    // Get next char
    char = s.substring(i, i + 1)
    // For counting char
    for (j = 1; j <= i; j++) {
      // For putting each first new char in upper case
      if (j === 1) {
        char = char.toUpperCase();
        result += char;
      }
      // else lower case
      else {
        char = char.toLowerCase();
        result += char;
      }
    }
  }
  // Remove last '-' char and return result
  return result.substring(0, result.length - 1);
}

console.log(accum("aHtuE"))

2

Answers


  1. You can do this as:

    let str = "aHtuF"
    
    const result = str
      .split("")
      .map((ch, i) => `${ch.toUpperCase()}${Array(i).fill(ch.toLowerCase()).join("")}`)
      .join("-")
    console.log(result);

    or

    let str = "aHtuF"
    
    
    const result = str
                    .split("")
                    .map((ch, i) => `${ch.toUpperCase()}${ch.toLowerCase().repeat(i)}`)
                    .join("-")
                    
    console.log(result);
    Login or Signup to reply.
  2. When you enter the next iteration of the loop, you also add the previous char to your result. In case of the H this is still an uppercase H because for the H you never entered the branch where it was converted to lowercase because for the H the outer loops index i == 1 and thus, your j will not get > 1

    The fix is easy: Add the correct number of the respective character within the same iteration of the outer loop … See the //******** comments in the code for changes

    function accum(s) {
      let char = (s.substring(0, 1)).toUpperCase();
    
      //******************************
      //Initialize the result with the first character
      let result = char; 
    
      //*******************
      //don't need an extra loop iteration here
      for (i = 1; i < s.length; i++) {
    
        //***********************************
        // Add only '-' here instead of also the previous char 
        result += "-";
    
        char = s.substring(i, i + 1)
    
        //**********************************************************
        //Add the correct count of the current char to the result
        for (j = 0; j <= i; j++) {  
    
          //*****************
           //Of course need to adapt the condition here
          if (j === 0) {
            char = char.toUpperCase();
            result += char;
          }
          else {
            char = char.toLowerCase();
            result += char;
          }
        }
      }
      
      //**************************
      //no need to remove anything from result
      return result;
    }
    
    console.log(accum("aHtuE"))
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search