3

给定s,在新行上打印单词数。例如,s = oneTwoThree。字符串中有 3 个单词。

我知道我找到了大写的字母,但不确定我是否正确计算了单词。

我错过了什么?

输入

在编辑器中保存更改

输出

5

现在,我得到0。

function camelCase(s) {

   let count = 0;

   for(let i of s){

    if(s.charAt(i) === s.charAt(i).toUpperCase()){

      count++

    }
   }
   return count
}
4

3 回答 3

3

我只能看到两个问题。你想要let i in s,没有let i of s。(前者为您提供索引,而后者为您提供该位置的实际字母)。

第二个问题是您可能希望从第一个单词开始计数,1因为第一个单词总是以小写字母开头。

function camelcase(s) {
   let count = 1;
   for(let i in s){
    if(s.charAt(i) === s.charAt(i).toUpperCase()){
      count++
    }
   }
   return count
}

console.log(camelcase("oneTwoThree"));

如果这是一个编码挑战,您可能需要考虑边缘情况。例如,空字符串的答案应该是什么?你应该为此明确测试吗?输入字符串中是否会有空格、数字或特殊字符?这可能是当前逻辑的问题。

于 2020-03-11T02:49:18.443 回答
1

您正在计算大写字母char,而字符串oneTwoThree只有两个大写字母。因此,输出将是 2。

相反,您可以使用正则表达式将字符串拆分为大写。

const s = 'oneTwoThree';

console.log(s.split(/(?=[A-Z])/g).length);

于 2020-03-11T02:54:32.563 回答
1

您可以使用正则表达式替换所有lower case字母,然后计算剩余的。

let string1 = "saveChangesInTheEditor";
let string2 = "oneTwoThree";
//For empty Strings
let string3 = "";

function camelcase(s) {
  return (s ? (s.trim().replace(/[^A-Z]/g, "").length + 1) : 0);
}

console.log(camelcase(string1));
console.log(camelcase(string2));
console.log(camelcase(string3));

下面的代码片段用于数组,如果你想传递一个数组,你可以使用它。该函数将返回一个具有相同顺序的世界计数的数组。

let arr = ["saveChangesInTheEditor", "oneTwoThree", ""]

function camelcase(s) {
  if (Array.isArray(s)) {
    let camelCase = [];
    for (const string of s) {
      camelCase.push((string ? (string.trim().replace(/[^A-Z]/g, "").length + 1) : 0));
    }
    return camelCase;
  } else {
    return (s ? (s.trim().replace(/[^A-Z]/g, "").length + 1) : 0);
  }
}

console.log(camelcase(arr));

于 2020-03-11T02:55:00.743 回答