Jacascript:大小写字符串拼图 - 一个字符不正确

问题描述 投票:0回答:2
  • 输入:
    aHtuE
  • 预期输出:
    A-Hh-Ttt-Uuuu-Eeeee
  • 实际输出:
    A-HH-Ttt-Uuuu-Eeeee

该函数接受一个字符串(在本例中为“aHtuE”),输出应为“A-Hh-Ttt-Uuuu-Eeeee”。然而,此示例中的第二个“h”以大写而不是小写显示。我猜这是一个计数问题,但无论我尝试什么,我都不明白。

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"))

javascript for-loop uppercase lowercase
2个回答
1
投票

您可以使用

split
map
join
来执行此操作,如下所示:

let str = "aHtuF"

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

let str = "aHtuF"


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


0
投票

当您进入循环的下一次迭代时,您还会将前一个

char
添加到结果中。对于
H
,这仍然是大写
H
,因为对于
H
,您从未进入将其转换为小写的分支,因为对于
H
,外循环索引
i == 1
,因此,您的
 j
不会得到
> 1
...

修复很简单:在外循环的同一迭代中添加正确数量的相应字符...请参阅代码中的

//********
注释以了解更改

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"))

您还可以稍微简化此代码,如下所示

function accum(s) {
  //if s is an empty string or null or undefined 
  //just return an empty string as result
  if (!s) return "";
  let 
    //access character by index and make it uppercase immediately
    //initialize result with the first character
    result = s[0].toUpperCase(); 
    
  for (i = 1; i < s.length; i++) {
    //add the delimiter and current character as uppercase
    result += "-" + s[i].toUpperCase();
    //get the current character as lowercase
    let char = s[i].toLowerCase();
    //add the correct number of lowercase characters
    for (j = 0; j < i; j++) {  
      result += char;  
    }
  }
  return result;
}

console.log("aHtuE", accum("aHtuE"))
console.log("foobar", accum("foobar"))
console.log("empty string", accum(""))
console.log("null", accum(null))
console.log("undefined", accum(undefined))
console.log("undefined", accum())

© www.soinside.com 2019 - 2024. All rights reserved.